unit frm_CalidadGruposEditor;

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,
  Vcl.ComCtrls, Data.DB, FireDAC.Comp.Client, uAppTheme, FireDAC.Stan.Param, uBaseForm,
  Vcl.Grids, Vcl.DBGrids, System.UITypes;

type
  TfrmCalidadGruposEditor = class(TfrmBase)
    lblCodigo: TLabel;
    edtCodigo: TEdit;
    lblNombre: TLabel;
    edtNombre: TEdit;
    lblOrden: TLabel;
    edtOrden: TEdit;
    chkActivo: TCheckBox;
    lblDescripcion: TLabel;
    memDescripcion: TMemo;
    procedure FormShow(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnSalirClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
  protected
    procedure DoAnadir; override;
    procedure DoModificar; override;
    procedure DoPrimero; override;
    procedure DoAnterior; override;
    procedure DoSiguiente; override;
    procedure DoUltimo; override;
  private
    FGrupoId: string;
    FParentForm: TForm;
    procedure LoadData;
    procedure ClearEditsModified;
  public
    property GrupoId: string read FGrupoId write FGrupoId;
    property ParentForm: TForm read FParentForm write FParentForm;
  end;

var
  frmCalidadGruposEditor: TfrmCalidadGruposEditor;

implementation

uses
  dmg_Main, dmg_Calidad, uDbErrorHandler, frm_CalidadGrupos;

{$R *.dfm}

procedure TfrmCalidadGruposEditor.FormShow(Sender: TObject);
begin
  inherited;

  // Aplicar tema estándar
  TAppTheme.ApplyToForm(Self);

  edtCodigo.ReadOnly := True;
  edtCodigo.Color := clBtnFace;

  // Vincular eventos a la barra superior heredada
  btnGuardar.OnClick := btnSaveClick;
  btnSalir.OnClick := btnSalirClick;

  // Ocultar componentes/paneles heredados innecesarios
  pgcDetails.Visible := True;
  TsListado.TabVisible := False;
  pgcDetails.ActivePage := tsDatosEnvio;
  pnlSideToolbar.Visible := False;
  dbgItems.Visible := False;
  pnlFooter.Visible := False;

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

procedure TfrmCalidadGruposEditor.ClearEditsModified;
var
  I: Integer;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    if Components[I] is TCustomEdit then
      TCustomEdit(Components[I]).Modified := False;
  end;
end;

procedure TfrmCalidadGruposEditor.LoadData;
begin
  if FGrupoId = '' then Exit;

  dmgMain.qryExec.Close;
  dmgMain.qryExec.SQL.Text := 'SELECT * FROM ge_calidad_grupos WHERE id = :id';
  dmgMain.qryExec.ParamByName('id').AsString := FGrupoId;
  dmgMain.qryExec.Open;

  if not dmgMain.qryExec.IsEmpty then
  begin
    edtCodigo.Text := dmgMain.qryExec.FieldByName('codigo').AsString;
    edtNombre.Text := dmgMain.qryExec.FieldByName('nombre').AsString;
    edtOrden.Text := dmgMain.qryExec.FieldByName('orden').AsString;
    chkActivo.Checked := dmgMain.qryExec.FieldByName('activo').AsInteger <> 0;
    memDescripcion.Text := dmgMain.qryExec.FieldByName('descripcion').AsString;
  end;
  dmgMain.qryExec.Close;

  ClearEditsModified;
  ResetChangeTracking;
end;

procedure TfrmCalidadGruposEditor.btnSaveClick(Sender: TObject);
var
  LIsNew: Boolean;
begin
  if Trim(edtNombre.Text) = '' then
  begin
    ShowMessage('El nombre del grupo de calidad es obligatorio.');
    edtNombre.SetFocus;
    Exit;
  end;

  LIsNew := (FGrupoId = '');

  dmgMain.qryExec.Close;
  if LIsNew then
  begin
    dmgMain.qryExec.SQL.Text :=
      'INSERT INTO ge_calidad_grupos (codigo, nombre, descripcion, orden, activo, id_user_creator, id_user_update) ' +
      'VALUES (:cod, :nom, :desc, :ord, :act, :user, :user)';
    dmgMain.qryExec.ParamByName('cod').AsString := UpperCase(Trim(StringReplace(edtNombre.Text, ' ', '_', [rfReplaceAll])));
  end
  else
  begin
    dmgMain.qryExec.SQL.Text :=
      'UPDATE ge_calidad_grupos SET nombre = :nom, descripcion = :desc, orden = :ord, activo = :act, ' +
      '       id_user_update = :user, updated_at = CURRENT_TIMESTAMP ' +
      'WHERE id = :id';
    dmgMain.qryExec.ParamByName('id').AsString := FGrupoId;
  end;

  dmgMain.qryExec.ParamByName('nom').AsString := Trim(edtNombre.Text);
  dmgMain.qryExec.ParamByName('desc').AsString := memDescripcion.Text;
  dmgMain.qryExec.ParamByName('ord').AsInteger := StrToIntDef(edtOrden.Text, 1);
  dmgMain.qryExec.ParamByName('act').AsBoolean := chkActivo.Checked;
  dmgMain.qryExec.ParamByName('user').AsString := dmgMain.CurrentUserId;

  try
    dmgMain.qryExec.ExecSQL;

    if LIsNew then
    begin
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'SELECT LAST_INSERT_ID()';
      dmgMain.qryExec.Open;
      FGrupoId := dmgMain.qryExec.Fields[0].AsString;
      dmgMain.qryExec.Close;
    end;

    ResetModifiedState;
    ShowMessage('Grupo de calidad guardado correctamente.');

    // Refrescar padre
    if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
    begin
      TfrmCalidadGrupos(FParentForm).btnRefreshClick(nil);
      TfrmCalidadGrupos(FParentForm).QryMain.Locate('id', FGrupoId, []);
    end;

    ResetChangeTracking;
    ShowMessage('Grupo de calidad guardado correctamente.');
  except
    on E: Exception do
      TDbErrorHandler.HandleException(E, 'Error al guardar el grupo de calidad');
  end;
end;

procedure TfrmCalidadGruposEditor.btnEliminarClick(Sender: TObject);
var
  LParent: TfrmCalidadGrupos;
begin
  if FGrupoId = '' then Exit;

  if MessageDlg('¿Está seguro de que desea eliminar este grupo de calidad?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_calidad_grupos WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FGrupoId;
      dmgMain.qryExec.ExecSQL;

      LParent := nil;
      if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
        LParent := TfrmCalidadGrupos(FParentForm);

      if Assigned(LParent) then
        LParent.btnRefreshClick(nil);

      ModalResult := mrOk;
    except
      on E: Exception do
        TDbErrorHandler.HandleException(E, 'Error al eliminar el grupo de calidad');
    end;
  end;
end;

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

procedure TfrmCalidadGruposEditor.DoAnadir;
begin
  FGrupoId := '';
  edtCodigo.Text := '(Autonumérico)';
  edtNombre.Clear;
  edtOrden.Text := '1';
  chkActivo.Checked := True;
  memDescripcion.Clear;
  ClearEditsModified;
  edtNombre.SetFocus;
end;

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

procedure TfrmCalidadGruposEditor.DoPrimero;
var
  LParent: TfrmCalidadGrupos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
    LParent := TfrmCalidadGrupos(FParentForm)
  else if Assigned(frmCalidadGrupos) then
    LParent := frmCalidadGrupos;

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

procedure TfrmCalidadGruposEditor.DoAnterior;
var
  LParent: TfrmCalidadGrupos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
    LParent := TfrmCalidadGrupos(FParentForm)
  else if Assigned(frmCalidadGrupos) then
    LParent := frmCalidadGrupos;

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

procedure TfrmCalidadGruposEditor.DoSiguiente;
var
  LParent: TfrmCalidadGrupos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
    LParent := TfrmCalidadGrupos(FParentForm)
  else if Assigned(frmCalidadGrupos) then
    LParent := frmCalidadGrupos;

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

procedure TfrmCalidadGruposEditor.DoUltimo;
var
  LParent: TfrmCalidadGrupos;
begin
  LParent := nil;
  if Assigned(FParentForm) and (FParentForm is TfrmCalidadGrupos) then
    LParent := TfrmCalidadGrupos(FParentForm)
  else if Assigned(frmCalidadGrupos) then
    LParent := frmCalidadGrupos;

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

end.
