unit frm_SelectImpresoraEnvio;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,
  Vcl.ExtCtrls, Vcl.Printers, uAppTheme;

type
  TfrmSelectImpresoraEnvio = class(TForm)
    pnlHeader: TPanel;
    lblTitulo: TLabel;
    lblSubtitulo: TLabel;
    pnlContent: TPanel;
    rbImpresora: TRadioButton;
    cbImpresoras: TComboBox;
    rbPDF: TRadioButton;
    lblInfoPDF: TLabel;
    chkGirar180: TCheckBox;
    pnlFooter: TPanel;
    btnAceptar: TBitBtn;
    btnCancelar: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure rbImpresoraClick(Sender: TObject);
    procedure rbPDFClick(Sender: TObject);
    procedure btnAceptarClick(Sender: TObject);
  private
    FTransportistaNombre: string;
    FImpresoraSugerida: string;
    FImpresoraSeleccionada: string;
    FEsPDF: Boolean;
    FGirar180: Boolean;
    procedure CargarImpresoras;
  public
    class function SeleccionarDestino(AOwner: TComponent;
      const ATransportistaNombre: string;
      const AImpresoraSugerida: string;
      out AImpresoraSeleccionada: string;
      out AEsPDF: Boolean): Boolean; overload;

    class function SeleccionarDestino(AOwner: TComponent;
      const ATransportistaNombre: string;
      const AImpresoraSugerida: string;
      out AImpresoraSeleccionada: string;
      out AEsPDF: Boolean;
      out AGirar180: Boolean): Boolean; overload;

    property TransportistaNombre: string read FTransportistaNombre write FTransportistaNombre;
    property ImpresoraSugerida: string read FImpresoraSugerida write FImpresoraSugerida;
    property ImpresoraSeleccionada: string read FImpresoraSeleccionada;
    property EsPDF: Boolean read FEsPDF;
    property Girar180: Boolean read FGirar180;
  end;

var
  frmSelectImpresoraEnvio: TfrmSelectImpresoraEnvio;

implementation

{$R *.dfm}

class function TfrmSelectImpresoraEnvio.SeleccionarDestino(AOwner: TComponent;
  const ATransportistaNombre: string;
  const AImpresoraSugerida: string;
  out AImpresoraSeleccionada: string;
  out AEsPDF: Boolean): Boolean;
var
  LDummyGirar: Boolean;
begin
  Result := SeleccionarDestino(AOwner, ATransportistaNombre, AImpresoraSugerida,
    AImpresoraSeleccionada, AEsPDF, LDummyGirar);
end;

class function TfrmSelectImpresoraEnvio.SeleccionarDestino(AOwner: TComponent;
  const ATransportistaNombre: string;
  const AImpresoraSugerida: string;
  out AImpresoraSeleccionada: string;
  out AEsPDF: Boolean;
  out AGirar180: Boolean): Boolean;
var
  LFrm: TfrmSelectImpresoraEnvio;
begin
  Result := False;
  AImpresoraSeleccionada := '';
  AEsPDF := False;
  AGirar180 := True;

  LFrm := TfrmSelectImpresoraEnvio.Create(AOwner);
  try
    LFrm.TransportistaNombre := ATransportistaNombre;
    LFrm.ImpresoraSugerida := AImpresoraSugerida;
    if LFrm.ShowModal = mrOk then
    begin
      AImpresoraSeleccionada := LFrm.FImpresoraSeleccionada;
      AEsPDF := LFrm.FEsPDF;
      AGirar180 := LFrm.FGirar180;
      Result := True;
    end;
  finally
    LFrm.Free;
  end;
end;

procedure TfrmSelectImpresoraEnvio.FormCreate(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);
  pnlHeader.Color := TAppTheme.COLOR_MAIN_RED;
  lblTitulo.Font.Color := TAppTheme.COLOR_TEXT_WHITE;
  lblSubtitulo.Font.Color := TAppTheme.COLOR_SOFT_GRAY;
end;

procedure TfrmSelectImpresoraEnvio.FormShow(Sender: TObject);
begin
  if FTransportistaNombre <> '' then
    lblTitulo.Caption := 'Impresión de Etiquetas — ' + FTransportistaNombre
  else
    lblTitulo.Caption := 'Impresión de Etiquetas de Envío';

  CargarImpresoras;
  rbImpresoraClick(nil);
end;

procedure TfrmSelectImpresoraEnvio.CargarImpresoras;
var
  i: Integer;
  LPreselectIdx: Integer;
  LPrinterName: string;
  LUpper: string;
begin
  cbImpresoras.Items.Clear;
  LPreselectIdx := -1;

  try
    for i := 0 to Printer.Printers.Count - 1 do
    begin
      LPrinterName := Printer.Printers[i];
      cbImpresoras.Items.Add(LPrinterName);

      // Si coincide con la impresora sugerida / configurada
      if (FImpresoraSugerida <> '') and (Pos(UpperCase(FImpresoraSugerida), UpperCase(LPrinterName)) > 0) then
        LPreselectIdx := i;

      // Si no tenemos seleccionada una sugerida, detectar si es una impresora térmica conocida
      if (LPreselectIdx = -1) then
      begin
        LUpper := UpperCase(LPrinterName);
        if (Pos('ZEBRA', LUpper) > 0) or
           (Pos('ZDESIGNER', LUpper) > 0) or
           (Pos('TEC', LUpper) > 0) or
           (Pos('TOSHIBA', LUpper) > 0) or
           (Pos('CITIZEN', LUpper) > 0) or
           (Pos('GODEX', LUpper) > 0) or
           (Pos('TSC', LUpper) > 0) or
           (Pos('HONEYWELL', LUpper) > 0) or
           (Pos('INTERMEC', LUpper) > 0) or
           (Pos('SATO', LUpper) > 0) or
           (Pos('DATAMAX', LUpper) > 0) or
           (Pos('THERMAL', LUpper) > 0) or
           (Pos('ETIQUETA', LUpper) > 0) or
           (Pos('LABEL', LUpper) > 0) or
           (Pos('DIRECT', LUpper) > 0) or
           (Pos('NACEX', LUpper) > 0) then
        begin
          LPreselectIdx := i;
        end;
      end;
    end;
  except
    // Si no hay subsistema de impresión disponible
  end;

  if cbImpresoras.Items.Count > 0 then
  begin
    if (LPreselectIdx >= 0) and (LPreselectIdx < cbImpresoras.Items.Count) then
      cbImpresoras.ItemIndex := LPreselectIdx
    else
      cbImpresoras.ItemIndex := 0;

    rbImpresora.Checked := True;
  end
  else
  begin
    rbPDF.Checked := True;
    rbImpresora.Enabled := False;
    cbImpresoras.Enabled := False;
  end;
end;

procedure TfrmSelectImpresoraEnvio.rbImpresoraClick(Sender: TObject);
begin
  cbImpresoras.Enabled := rbImpresora.Checked and (cbImpresoras.Items.Count > 0);
  if cbImpresoras.Enabled and (cbImpresoras.ItemIndex < 0) and (cbImpresoras.Items.Count > 0) then
    cbImpresoras.ItemIndex := 0;
end;

procedure TfrmSelectImpresoraEnvio.rbPDFClick(Sender: TObject);
begin
  cbImpresoras.Enabled := False;
end;

procedure TfrmSelectImpresoraEnvio.btnAceptarClick(Sender: TObject);
begin
  FEsPDF := rbPDF.Checked;
  if rbImpresora.Checked then
  begin
    if cbImpresoras.ItemIndex >= 0 then
      FImpresoraSeleccionada := cbImpresoras.Items[cbImpresoras.ItemIndex]
    else
      FImpresoraSeleccionada := '';
  end
  else
    FImpresoraSeleccionada := '';

  ModalResult := mrOk;
end;

end.
