unit frm_CalidadGrupos;

interface

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

type
  TfrmCalidadGrupos = class(TfrmBaseList)
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject); override;
    procedure btnNewClick(Sender: TObject); override;
    procedure btnEditClick(Sender: TObject); override;
    procedure btnDeleteClick(Sender: TObject); override;
  private
    procedure dbGridMainCellClick(Column: TColumn);
    procedure dbGridMainKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  public
    { Public declarations }
  end;

var
  frmCalidadGrupos: TfrmCalidadGrupos;

implementation

uses
  dmg_Main, frm_CalidadGruposEditor, uDbErrorHandler;

{$R *.dfm}

procedure TfrmCalidadGrupos.FormShow(Sender: TObject);
begin
  AlphaFilterField := 'nombre';
  StatusFilterField := 'activo';
  StatusValues.Clear;
  StatusValues.Add('Activo');
  StatusValues.Add('Inactivo');
  DateFilterField := 'created_at';

  inherited;
  frmCalidadGrupos := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Grupo de Calidad:';

  dbGridMain.Options := dbGridMain.Options + [dgEditing] - [dgRowSelect];
  dbGridMain.OnCellClick := dbGridMainCellClick;
  dbGridMain.OnKeyDown := dbGridMainKeyDown;
end;

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

procedure TfrmCalidadGrupos.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  FQryMain.Close;
  LSql := 'SELECT id, codigo, nombre, CAST(descripcion AS CHAR(255)) as descripcion, orden, activo, created_at FROM ge_calidad_grupos ';
  
  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'WHERE nombre LIKE :search OR codigo LIKE :search ';
  end;
  LSql := LSql + 'ORDER BY orden, nombre';
  
  FQryMain.SQL.Text := LSql;
  
  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';
    
  FQryMain.Open;
  
  // Configurar FireDAC para permitir edición in-situ del campo activo
  FQryMain.UpdateOptions.UpdateTableName := 'ge_calidad_grupos';
  FQryMain.UpdateOptions.KeyFields := 'id';
  FQryMain.UpdateOptions.ReadOnly := False;
  
  if FQryMain.FindField('activo') <> nil then
    FQryMain.FieldByName('activo').ReadOnly := False;

  // Configurar columnas de la rejilla
  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'id';
    Title.Caption := 'ID';
    Width := 50;
    ReadOnly := True;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'codigo';
    Title.Caption := 'Código';
    Width := 140;
    ReadOnly := True;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'nombre';
    Title.Caption := 'Nombre del Grupo';
    Width := 250;
    ReadOnly := True;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'descripcion';
    Title.Caption := 'Descripción';
    Width := 300;
    ReadOnly := True;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'orden';
    Title.Caption := 'Orden';
    Width := 60;
    ReadOnly := True;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'activo';
    Title.Caption := 'Activo';
    Width := 70;
    ReadOnly := False;
  end;
end;

procedure TfrmCalidadGrupos.btnEditClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if not Assigned(frmCalidadGruposEditor) then
    Application.CreateForm(TfrmCalidadGruposEditor, frmCalidadGruposEditor);
  
  frmCalidadGruposEditor.ParentForm := Self;
  frmCalidadGruposEditor.GrupoId := FQryMain.FieldByName('id').AsString;
  if frmCalidadGruposEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmCalidadGrupos.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmCalidadGruposEditor) then
    Application.CreateForm(TfrmCalidadGruposEditor, frmCalidadGruposEditor);
  
  frmCalidadGruposEditor.ParentForm := Self;
  frmCalidadGruposEditor.GrupoId := '';
  if frmCalidadGruposEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmCalidadGrupos.btnDeleteClick(Sender: TObject);
var
  LGrupoId: string;
begin
  if FQryMain.IsEmpty then Exit;
  
  if MessageDlg('¿Está seguro de que desea eliminar este grupo de calidad?', 
                mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
    LGrupoId := FQryMain.FieldByName('id').AsString;
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_calidad_grupos WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := LGrupoId;
      dmgMain.qryExec.ExecSQL;
      
      btnRefreshClick(nil);
    except
      on E: Exception do
        TDbErrorHandler.HandleException(E, 'Error al eliminar el grupo de calidad');
    end;
  end;
end;

procedure TfrmCalidadGrupos.dbGridMainCellClick(Column: TColumn);
var
  LIsActive: Boolean;
begin
  if (Column.Field <> nil) and SameText(Column.FieldName, 'activo') then
  begin
    if not (FQryMain.State in [dsEdit]) then
      FQryMain.Edit;
      
    try
      LIsActive := Column.Field.AsInteger <> 0;
      if LIsActive then
        Column.Field.AsInteger := 0
      else
        Column.Field.AsInteger := 1;
    except
      Column.Field.AsBoolean := not Column.Field.AsBoolean;
    end;
    
    FQryMain.Post;
  end;
end;

procedure TfrmCalidadGrupos.dbGridMainKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  LIsActive: Boolean;
begin
  if (Key = VK_SPACE) and (dbGridMain.SelectedField <> nil) and SameText(dbGridMain.SelectedField.FieldName, 'activo') then
  begin
    if not (FQryMain.State in [dsEdit]) then
      FQryMain.Edit;
      
    try
      LIsActive := dbGridMain.SelectedField.AsInteger <> 0;
      if LIsActive then
        dbGridMain.SelectedField.AsInteger := 0
      else
        dbGridMain.SelectedField.AsInteger := 1;
    except
      dbGridMain.SelectedField.AsBoolean := not dbGridMain.SelectedField.AsBoolean;
    end;
    
    FQryMain.Post;
    Key := 0;
  end;
end;

end.
