unit frm_Usuarios;

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;

type
  TfrmUsuarios = 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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmUsuarios: TfrmUsuarios;

implementation

uses
  dmg_Main, uDbErrorHandler, frm_UsuariosEditor;

{$R *.dfm}

procedure TfrmUsuarios.FormShow(Sender: TObject);
begin
  inherited;
  frmUsuarios := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Usuario:';
end;

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

procedure TfrmUsuarios.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  FQryMain.Close;
  LSql := 'SELECT id, username, nombre_completo, email, rol, activo, es_admin_global FROM ge_usuarios ';
  
  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'WHERE username LIKE :search OR nombre_completo LIKE :search OR email LIKE :search ';
  end;
  LSql := LSql + 'ORDER BY username';
  
  FQryMain.SQL.Text := LSql;
  
  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';
    
  FQryMain.Open;
  
  // Configurar títulos y anchos de columnas de la rejilla
  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'username';
    Title.Caption := 'Usuario';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'nombre_completo';
    Title.Caption := 'Nombre Completo';
    Width := 250;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'email';
    Title.Caption := 'Correo Electrónico';
    Width := 200;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'rol';
    Title.Caption := 'Rol';
    Width := 100;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'es_admin_global';
    Title.Caption := 'Admin Global';
    Width := 80;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'activo';
    Title.Caption := 'Activo';
    Width := 80;
  end;
end;

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

procedure TfrmUsuarios.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmUsuariosEditor) then
    Application.CreateForm(TfrmUsuariosEditor, frmUsuariosEditor);
  
  frmUsuariosEditor.ParentForm := Self;
  frmUsuariosEditor.UserId := '';
  if frmUsuariosEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmUsuarios.btnDeleteClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if FQryMain.FieldByName('id').AsString = '1' then
  begin
    ShowMessage('No se puede eliminar el usuario administrador principal por razones de seguridad.');
    Exit;
  end;
  
  if FQryMain.FieldByName('id').AsString = dmgMain.CurrentUserId then
  begin
    ShowMessage('No puedes eliminar tu propio usuario en sesión activa.');
    Exit;
  end;
  
  if MessageDlg('¿Está seguro de que desea eliminar este usuario?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_usuarios WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FQryMain.FieldByName('id').AsString;
      dmgMain.qryExec.ExecSQL;
      btnRefreshClick(nil);
    except
      on E: Exception do
        ShowMessage('Error al eliminar el usuario: ' + E.Message);
    end;
  end;
end;

end.
