unit frm_ClientesDestinosEditor;

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, uBaseForm, uAppTheme, Vcl.ComCtrls, Vcl.Grids, Vcl.DBGrids, System.UITypes;

type
  TfrmClientesDestinosEditor = class(TfrmBase)
    lblDescripcion: TLabel;
    edtDescripcion: TEdit;
    lblDireccion: TLabel;
    edtDireccion: TEdit;
    lblPoblacion: TLabel;
    edtPoblacion: TEdit;
    lblCP: TLabel;
    edtCP: TEdit;
    lblProvincia: TLabel;
    edtProvincia: TEdit;
    lblPais: TLabel;
    edtPais: TEdit;
    chkActivo: TCheckBox;
    lblEanFacturacion: TLabel;
    edtEanFacturacion: TEdit;
    lblEanCliente: TLabel;
    edtEanCliente: TEdit;
    lblEanEmisor: TLabel;
    edtEanEmisor: TEdit;
    lblEanReceptor: TLabel;
    edtEanReceptor: TEdit;
    lblCentro: TLabel;
    edtCentro: TEdit;
    lblEanDepartamento: TLabel;
    edtEanDepartamento: TEdit;
    btnCopiarCliente: TBitBtn;
    procedure FormShow(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSalirClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnCopiarClienteClick(Sender: TObject);
  protected
    procedure Loaded; override;
    procedure DoAnadir; override;
    procedure DoModificar; override;
    function HasUnsavedChanges: Boolean; override;
    function IsNewRecord: Boolean; override;
    procedure DoShow; override;
  private
    FDataSet: TDataSet;
    FIsNewRecord: Boolean;
    FClienteId: string;
    procedure LoadData;
    procedure SaveData;
  public
    property DataSet: TDataSet read FDataSet write FDataSet;
    property IsNew: Boolean read FIsNewRecord write FIsNewRecord;
    property ClienteId: string read FClienteId write FClienteId;
  end;

var
  frmClientesDestinosEditor: TfrmClientesDestinosEditor;

implementation

uses
  dmg_Main, FireDAC.Stan.Param;

{$R *.dfm}

procedure TfrmClientesDestinosEditor.Loaded;
begin
  inherited Loaded;
  OnShow := FormShow;
  OnDestroy := FormDestroy;
end;

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

  // Ocultar componentes innecesarios del base
  pgcDetails.Visible := False;
  pnlSideToolbar.Visible := False;

  // Vincular eventos a los botones heredados
  btnGuardar.OnClick := btnSaveClick;
  btnSalir.OnClick := btnSalirClick;

  // Los botones de navegación no son necesarios en este sub-diálogo
  btnPrimero.Visible := False;
  btnAnterior.Visible := False;
  btnSiguiente.Visible := False;
  btnUltimo.Visible := False;
  btnAnadir.Visible := False;
  btnModificar.Visible := False;
  btnEliminar.Visible := False;
  btnBuscar.Visible := False;
  btnImprimir.Visible := False;
  btnDuplicar.Visible := False;
  btnRect.Visible := False;
  btnIA.Visible := False;

  if Assigned(FDataSet) then
  begin
    if FIsNewRecord then
      DoAnadir
    else
      LoadData;
  end;
end;

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

procedure TfrmClientesDestinosEditor.LoadData;
begin
  edtDescripcion.Text := FDataSet.FieldByName('descripcion').AsString;
  edtDireccion.Text := FDataSet.FieldByName('direccion').AsString;
  edtPoblacion.Text := FDataSet.FieldByName('poblacion').AsString;
  edtCP.Text := FDataSet.FieldByName('cp').AsString;
  edtProvincia.Text := FDataSet.FieldByName('provincia').AsString;
  edtPais.Text := FDataSet.FieldByName('pais').AsString;
  chkActivo.Checked := FDataSet.FieldByName('activo').AsInteger <> 0;
  edtEanFacturacion.Text := FDataSet.FieldByName('ean_facturacion').AsString;
  edtEanCliente.Text := FDataSet.FieldByName('ean_cliente').AsString;
  edtEanEmisor.Text := FDataSet.FieldByName('ean_emisor').AsString;
  edtEanReceptor.Text := FDataSet.FieldByName('ean_receptor').AsString;
  edtCentro.Text := FDataSet.FieldByName('centro').AsString;
  edtEanDepartamento.Text := FDataSet.FieldByName('departamento').AsString;
  
  ResetChangeTracking;
end;

procedure TfrmClientesDestinosEditor.SaveData;
begin
  FDataSet.FieldByName('descripcion').AsString := Trim(edtDescripcion.Text);
  FDataSet.FieldByName('direccion').AsString := Trim(edtDireccion.Text);
  FDataSet.FieldByName('poblacion').AsString := Trim(edtPoblacion.Text);
  FDataSet.FieldByName('cp').AsString := Trim(edtCP.Text);
  FDataSet.FieldByName('provincia').AsString := Trim(edtProvincia.Text);
  FDataSet.FieldByName('pais').AsString := Trim(edtPais.Text);
  if chkActivo.Checked then
    FDataSet.FieldByName('activo').AsInteger := 1
  else
    FDataSet.FieldByName('activo').AsInteger := 0;
  FDataSet.FieldByName('ean_facturacion').AsString := Trim(edtEanFacturacion.Text);
  FDataSet.FieldByName('ean_cliente').AsString := Trim(edtEanCliente.Text);
  FDataSet.FieldByName('ean_emisor').AsString := Trim(edtEanEmisor.Text);
  FDataSet.FieldByName('ean_receptor').AsString := Trim(edtEanReceptor.Text);
  FDataSet.FieldByName('centro').AsString := Trim(edtCentro.Text);
  FDataSet.FieldByName('departamento').AsString := Trim(edtEanDepartamento.Text);
end;

procedure TfrmClientesDestinosEditor.DoAnadir;
var
  LCliId: string;
  LCount: Integer;
begin
  edtDescripcion.Clear;
  edtDireccion.Clear;
  edtPoblacion.Clear;
  edtCP.Clear;
  edtProvincia.Clear;
  edtPais.Text := 'ES';
  chkActivo.Checked := True;
  edtEanFacturacion.Clear;
  edtEanCliente.Clear;
  edtEanEmisor.Clear;
  edtEanReceptor.Clear;
  edtCentro.Clear;
  edtEanDepartamento.Clear;
  
  ResetChangeTracking;

  // Si el cliente no tiene ningún destino configurado, autocompletar con los datos del cliente
  LCliId := FClienteId;
  if (LCliId = '') and Assigned(FDataSet) and (FDataSet.FindField('id_cliente') <> nil) then
    LCliId := FDataSet.FieldByName('id_cliente').AsString;

  if (LCliId <> '') and (LCliId <> '0') then
  begin
    LCount := 0;
    dmgMain.qryExec.Close;
    dmgMain.qryExec.SQL.Text := 'SELECT COUNT(*) AS total FROM ge_clientes_destinos WHERE id_cliente = :cli';
    dmgMain.qryExec.ParamByName('cli').AsString := LCliId;
    dmgMain.qryExec.Open;
    try
      if not dmgMain.qryExec.IsEmpty then
        LCount := dmgMain.qryExec.FieldByName('total').AsInteger;
    finally
      dmgMain.qryExec.Close;
    end;

    if LCount = 0 then
      btnCopiarClienteClick(nil);
  end;

  if Trim(edtDescripcion.Text) <> '' then
    edtDireccion.SetFocus
  else
    edtDescripcion.SetFocus;
end;

procedure TfrmClientesDestinosEditor.DoModificar;
begin
  edtDescripcion.SetFocus;
end;

function TfrmClientesDestinosEditor.HasUnsavedChanges: Boolean;
begin
  Result := inherited HasUnsavedChanges;
end;

function TfrmClientesDestinosEditor.IsNewRecord: Boolean;
begin
  Result := FIsNewRecord;
end;

procedure TfrmClientesDestinosEditor.btnSaveClick(Sender: TObject);
begin
  if Trim(edtDescripcion.Text) = '' then
  begin
    ShowMessage('Debe introducir la descripción o nombre de la sucursal.');
    edtDescripcion.SetFocus;
    Exit;
  end;

  try
    SaveData;
    // Si todo va bien, establecemos ModalResult en mrOk para que el padre confirme
    ModalResult := mrOk;
  except
    on E: Exception do
      ShowMessage('Error al volcar los datos: ' + E.Message);
  end;
end;

procedure TfrmClientesDestinosEditor.DoShow;
begin
  inherited DoShow;
  // Desvincular el hook del base para que el guardar cierre el diálogo modal con mrOk
  btnGuardar.OnClick := btnSaveClick;
end;

procedure TfrmClientesDestinosEditor.btnSalirClick(Sender: TObject);
begin
  ModalResult := mrCancel;
  Close;
end;

procedure TfrmClientesDestinosEditor.btnCopiarClienteClick(Sender: TObject);
var
  LCliId: string;
  LNombre: string;
begin
  LCliId := FClienteId;
  if (LCliId = '') and Assigned(FDataSet) and (FDataSet.FindField('id_cliente') <> nil) then
    LCliId := FDataSet.FieldByName('id_cliente').AsString;

  if (LCliId = '') or (LCliId = '0') then
  begin
    if Sender <> nil then
      ShowMessage('No se ha podido identificar el cliente asociado.');
    Exit;
  end;

  // Si ya tiene datos en dirección o descripción y se pulsa manualmente, solicitar confirmación antes de sobreescribir
  if (Sender <> nil) and ((Trim(edtDireccion.Text) <> '') or (Trim(edtPoblacion.Text) <> '')) then
  begin
    if MessageDlg('¿Desea sobrescribir los datos actuales con la dirección del cliente?',
                  mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
      Exit;
  end;

  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text :=
    'SELECT nombre_fiscal, nombre_comercial, domicilio, poblacion, codigo_postal, provincia, codigo_pais ' +
    'FROM ge_clientes WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsString := LCliId;
  dmgMain.qryExec.Open;
  try
    if not dmgMain.qryExec.IsEmpty then
    begin
      LNombre := Trim(dmgMain.qryExec.FieldByName('nombre_comercial').AsString);
      if LNombre = '' then
        LNombre := Trim(dmgMain.qryExec.FieldByName('nombre_fiscal').AsString);

      if Trim(edtDescripcion.Text) = '' then
        edtDescripcion.Text := LNombre;

      edtDireccion.Text := dmgMain.qryExec.FieldByName('domicilio').AsString;
      edtPoblacion.Text := dmgMain.qryExec.FieldByName('poblacion').AsString;
      edtCP.Text := dmgMain.qryExec.FieldByName('codigo_postal').AsString;
      edtProvincia.Text := dmgMain.qryExec.FieldByName('provincia').AsString;

      if Trim(dmgMain.qryExec.FieldByName('codigo_pais').AsString) <> '' then
        edtPais.Text := dmgMain.qryExec.FieldByName('codigo_pais').AsString
      else
        edtPais.Text := 'ES';

      edtDireccion.SetFocus;
    end
    else
    begin
      if Sender <> nil then
        ShowMessage('No se encontraron los datos del cliente especificado.');
    end;
  finally
    dmgMain.qryExec.Close;
  end;
end;

end.
