unit frm_TransportistasEditor;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons,
  Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Param, uAppTheme, uBaseForm,
  Vcl.Grids, Vcl.DBGrids, Vcl.ComCtrls;

type
  TfrmTransportistasEditor = class(TfrmBase)
    lblNombre: TLabel;
    edtNombre: TEdit;
    lblTipoApi: TLabel;
    cbTipoApi: TComboBox;
    chkActivo: TCheckBox;
    btnConfigEnvio: TButton;
    procedure FormShow(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSalirClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnConfigEnvioClick(Sender: TObject);
  protected
    procedure DoAnadir; override;
    procedure DoModificar; override;
    procedure DoPrimero; override;
    procedure DoAnterior; override;
    procedure DoSiguiente; override;
    procedure DoUltimo; override;
  private
    FTransportistaId: Integer;
    FParentForm: TForm;
    procedure LoadData;
  public
    property TransportistaId: Integer read FTransportistaId write FTransportistaId;
    property ParentForm: TForm read FParentForm write FParentForm;
  end;

var
  frmTransportistasEditor: TfrmTransportistasEditor;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_Transportistas, frm_EnviosConfig;

{$R *.dfm}

procedure TfrmTransportistasEditor.FormShow(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);

  btnGuardar.OnClick := btnSaveClick;
  btnSalir.OnClick := btnSalirClick;

  pgcDetails.Visible := True;
  TsListado.TabVisible := False;
  pgcDetails.ActivePage := tsDatosEnvio;
  pnlSideToolbar.Visible := False;
  dbgItems.Visible := False;
  pnlFooter.Visible := False;

  // Rellenar tipos de API soportados en cbTipoApi
  cbTipoApi.Items.Clear;
  cbTipoApi.Items.Add('TIPSA');
  cbTipoApi.Items.Add('MRW');
  cbTipoApi.Items.Add('SEUR');
  cbTipoApi.Items.Add('GLS');
  cbTipoApi.Items.Add('OTRO');
  cbTipoApi.ItemIndex := 0;

  if FTransportistaId > 0 then
    LoadData
  else
    DoAnadir;

  btnConfigEnvio.Enabled := FTransportistaId > 0;
end;

procedure TfrmTransportistasEditor.FormDestroy(Sender: TObject);
begin
  if frmTransportistasEditor = Self then
    frmTransportistasEditor := nil;
end;

procedure TfrmTransportistasEditor.LoadData;
begin
  if FTransportistaId = 0 then Exit;

  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text := 'SELECT nombre, tipo_api, activo FROM ge_envios_transportistas WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsInteger := FTransportistaId;
  dmgMain.qryExec.Open;
  
  if not dmgMain.qryExec.IsEmpty then
  begin
    edtNombre.Text := dmgMain.qryExec.FieldByName('nombre').AsString;
    
    // Seleccionar tipo de API correspondiente
    cbTipoApi.ItemIndex := cbTipoApi.Items.IndexOf(UpperCase(Trim(dmgMain.qryExec.FieldByName('tipo_api').AsString)));
    if cbTipoApi.ItemIndex < 0 then
      cbTipoApi.ItemIndex := cbTipoApi.Items.IndexOf('OTRO');
      
    chkActivo.Checked := dmgMain.qryExec.FieldByName('activo').AsInteger <> 0;
  end;
  dmgMain.qryExec.Close;
end;

procedure TfrmTransportistasEditor.DoAnadir;
begin
  FTransportistaId := 0;
  edtNombre.Clear;
  cbTipoApi.ItemIndex := 0;
  chkActivo.Checked := True;
  edtNombre.SetFocus;
end;

procedure TfrmTransportistasEditor.DoModificar;
begin
  edtNombre.SetFocus;
end;

procedure TfrmTransportistasEditor.DoPrimero;
var
  LParent: TfrmTransportistas;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmTransportistas) then
    LParent := TfrmTransportistas(FParentForm)
  else if Assigned(frmTransportistas) then
    LParent := frmTransportistas;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.First;
    FTransportistaId := LParent.QryMain.FieldByName('id').AsInteger;
    LoadData;
  end;
end;

procedure TfrmTransportistasEditor.DoAnterior;
var
  LParent: TfrmTransportistas;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmTransportistas) then
    LParent := TfrmTransportistas(FParentForm)
  else if Assigned(frmTransportistas) then
    LParent := frmTransportistas;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Prior;
    FTransportistaId := LParent.QryMain.FieldByName('id').AsInteger;
    LoadData;
  end;
end;

procedure TfrmTransportistasEditor.DoSiguiente;
var
  LParent: TfrmTransportistas;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmTransportistas) then
    LParent := TfrmTransportistas(FParentForm)
  else if Assigned(frmTransportistas) then
    LParent := frmTransportistas;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Next;
    FTransportistaId := LParent.QryMain.FieldByName('id').AsInteger;
    LoadData;
  end;
end;

procedure TfrmTransportistasEditor.DoUltimo;
var
  LParent: TfrmTransportistas;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmTransportistas) then
    LParent := TfrmTransportistas(FParentForm)
  else if Assigned(frmTransportistas) then
    LParent := frmTransportistas;

  if Assigned(LParent) and Assigned(LParent.QryMain) and not LParent.QryMain.IsEmpty then
  begin
    LParent.QryMain.Last;
    FTransportistaId := LParent.QryMain.FieldByName('id').AsInteger;
    LoadData;
  end;
end;

procedure TfrmTransportistasEditor.btnSalirClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmTransportistasEditor.btnSaveClick(Sender: TObject);
var
  LIsNew: Boolean;
begin
  if Trim(edtNombre.Text) = '' then
  begin
    ShowMessage('Debe introducir un nombre para el transportista.');
    edtNombre.SetFocus;
    Exit;
  end;
 
  LIsNew := (FTransportistaId = 0);
  
  try
    dmgMain.qryExec.Close;
    if LIsNew then
    begin
      dmgMain.qryExec.SQL.Text := 
        'INSERT INTO ge_envios_transportistas (nombre, tipo_api, activo) ' +
        'VALUES (:nombre, :tipo_api, :activo)';
    end
    else
    begin
      dmgMain.qryExec.SQL.Text := 
        'UPDATE ge_envios_transportistas SET nombre = :nombre, tipo_api = :tipo_api, activo = :activo ' +
        'WHERE id = :id';
    end;
 
    if not LIsNew then
      dmgMain.qryExec.ParamByName('id').AsInteger := FTransportistaId;
      
    dmgMain.qryExec.ParamByName('nombre').AsString := Trim(edtNombre.Text);
    dmgMain.qryExec.ParamByName('tipo_api').AsString := cbTipoApi.Text;
    
    if chkActivo.Checked then
      dmgMain.qryExec.ParamByName('activo').AsInteger := 1
    else
      dmgMain.qryExec.ParamByName('activo').AsInteger := 0;
      
    dmgMain.qryExec.ExecSQL;
    
    if Assigned(FParentForm) and (FParentForm is TfrmTransportistas) then
      TfrmTransportistas(FParentForm).btnRefreshClick(nil);
      
    ResetChangeTracking;
    ShowMessage('Transportista guardado correctamente.');
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, 'Error al guardar el transportista');
  end;
end;

procedure TfrmTransportistasEditor.btnConfigEnvioClick(Sender: TObject);
var
  LForm: TfrmEnviosConfig;
begin
  if FTransportistaId = 0 then
  begin
    ShowMessage('Debe guardar primero el transportista para poder configurar el envío.');
    Exit;
  end;

  Application.CreateForm(TfrmEnviosConfig, LForm);
  try
    LForm.EmpresaId := StrToIntDef(dmgMain.CurrentCompanyId, 0);
    LForm.TransportistaId := FTransportistaId;
    LForm.ShowModal;
  finally
    LForm.Free;
  end;
end;

end.
