unit frm_AlergenosEditor;

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.ComCtrls, Vcl.Grids, Vcl.DBGrids;

type
  TfrmAlergenosEditor = class(TfrmBase)
    lblCodigo: TLabel;
    edtCodigo: TEdit;
    lblNombre: TLabel;
    edtNombre: TEdit;
    lblNombreTecnico: TLabel;
    edtNombreTecnico: TEdit;
    chkActivo: TCheckBox;
    lblCodAlba: TLabel;
    edtCodAlba: TEdit;
    procedure FormShow(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSalirClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  protected
    procedure DoAnadir; override;
    procedure DoModificar; override;
    procedure DoPrimero; override;
    procedure DoAnterior; override;
    procedure DoSiguiente; override;
    procedure DoUltimo; override;
  private
    FAlergenoId: string;
    FParentForm: TForm;
    procedure LoadData;
  public
    property AlergenoId: string read FAlergenoId write FAlergenoId;
    property ParentForm: TForm read FParentForm write FParentForm;
  end;

var
  frmAlergenosEditor: TfrmAlergenosEditor;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_Alergenos;

{$R *.dfm}

procedure TfrmAlergenosEditor.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;

  // Ocultar componentes obsoletos de código (no existen en ge_alergenos)
  lblCodigo.Visible := False;
  edtCodigo.Visible := False;

  if FAlergenoId <> '' then
    LoadData
  else
    DoAnadir;
end;

procedure TfrmAlergenosEditor.FormDestroy(Sender: TObject);
begin
  // No-op
end;

procedure TfrmAlergenosEditor.LoadData;
begin
  if FAlergenoId = '' then Exit;

  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text := 'SELECT id, nombre, nombre_tecnico, icono, activo, cod_alba FROM ge_alergenos WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsString := FAlergenoId;
  dmgMain.qryExec.Open;
  
  if not dmgMain.qryExec.IsEmpty then
  begin
    edtNombre.Text := dmgMain.qryExec.FieldByName('nombre').AsString;
    edtNombreTecnico.Text := dmgMain.qryExec.FieldByName('nombre_tecnico').AsString;
    chkActivo.Checked := dmgMain.qryExec.FieldByName('activo').AsInteger <> 0;
    edtCodAlba.Text := dmgMain.qryExec.FieldByName('cod_alba').AsString;
  end;
  dmgMain.qryExec.Close;
end;

procedure TfrmAlergenosEditor.DoAnadir;
begin
  FAlergenoId := '';
  edtNombre.Clear;
  edtNombreTecnico.Clear;

  edtCodAlba.Clear;
  chkActivo.Checked := True;
  edtNombre.SetFocus;
end;

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

procedure TfrmAlergenosEditor.DoPrimero;
var
  LParent: TfrmAlergenos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmAlergenos) then
    LParent := TfrmAlergenos(FParentForm)
  else if Assigned(frmAlergenos) then
    LParent := frmAlergenos;

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

procedure TfrmAlergenosEditor.DoAnterior;
var
  LParent: TfrmAlergenos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmAlergenos) then
    LParent := TfrmAlergenos(FParentForm)
  else if Assigned(frmAlergenos) then
    LParent := frmAlergenos;

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

procedure TfrmAlergenosEditor.DoSiguiente;
var
  LParent: TfrmAlergenos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmAlergenos) then
    LParent := TfrmAlergenos(FParentForm)
  else if Assigned(frmAlergenos) then
    LParent := frmAlergenos;

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

procedure TfrmAlergenosEditor.DoUltimo;
var
  LParent: TfrmAlergenos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmAlergenos) then
    LParent := TfrmAlergenos(FParentForm)
  else if Assigned(frmAlergenos) then
    LParent := frmAlergenos;

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

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

procedure TfrmAlergenosEditor.btnSaveClick(Sender: TObject);
var
  LIsNew: Boolean;
begin
  if Trim(edtNombre.Text) = '' then
  begin
    ShowMessage('Debe introducir el nombre del alérgeno.');
    edtNombre.SetFocus;
    Exit;
  end;

  LIsNew := (FAlergenoId = '');
  try
    dmgMain.qryExec.Close;
    if LIsNew then
    begin
      dmgMain.qryExec.SQL.Text := 
        'INSERT INTO ge_alergenos (nombre, nombre_tecnico, icono, activo, cod_alba, id_user_creator, id_user_update) ' +
        'VALUES (:nom, :tec, :ico, :act, :cod_alba, :user, :user)';
    end
    else
    begin
      dmgMain.qryExec.SQL.Text := 
        'UPDATE ge_alergenos SET nombre = :nom, nombre_tecnico = :tec, ' +
        'icono = :ico, activo = :act, cod_alba = :cod_alba, id_user_update = :user, updated_at = CURRENT_TIMESTAMP ' +
        'WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FAlergenoId;
    end;
    dmgMain.qryExec.ParamByName('nom').AsString := Trim(edtNombre.Text);
    dmgMain.qryExec.ParamByName('tec').AsString := Trim(edtNombreTecnico.Text);
     dmgMain.qryExec.ParamByName('act').AsBoolean := chkActivo.Checked;
    dmgMain.qryExec.ParamByName('cod_alba').AsString := Trim(edtCodAlba.Text);
    dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;
    
    dmgMain.qryExec.ExecSQL;
    ResetChangeTracking;
    if Assigned(FParentForm) and (FParentForm is TfrmAlergenos) then
      TfrmAlergenos(FParentForm).btnRefreshClick(nil);
    ShowMessage('Alérgeno guardado correctamente.');
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, 'Error al guardar el alérgeno');
  end;
end;

end.
