﻿unit frm_Login;

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, System.UITypes, Vcl.Imaging.pngimage,
  FireDAC.Stan.Param;

type
  TfrmLogin = class(TForm)
    pnlBackground: TPanel;
    pnlLogin: TPanel;
    imgLogo: TImage;
    Label1: TLabel;
    Label2: TLabel;
    edtUser: TEdit;
    edtPass: TEdit;
    btnLogin: TBitBtn;
    btnCancel: TBitBtn;
    lblError: TLabel;
    shpSeparator: TShape;
    procedure btnLoginClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    FLoggedUser: string;
    FLoggedRole: string;
    FIsAuthenticated: Boolean;
  public
    { Public declarations }
    property IsAuthenticated: Boolean read FIsAuthenticated;
    property LoggedUser: string read FLoggedUser;
    property LoggedRole: string read FLoggedRole;
  end;

var
  frmLogin: TfrmLogin;

implementation

uses
  dmg_Main, uAppTheme, System.IniFiles;

{$R *.dfm}

procedure TfrmLogin.btnCancelClick(Sender: TObject);
begin
  FIsAuthenticated := False;
  ModalResult := mrCancel;
end;

procedure TfrmLogin.btnLoginClick(Sender: TObject);
begin
  lblError.Visible := False;
  
  // Asegurar conexión a la base de datos
  try
    if not dmgMain.dbConn.Connected then
      dmgMain.Connect;
  except
    on E: Exception do
    begin
      lblError.Caption := 'Error de conexión: ' + E.Message;
      lblError.Visible := True;
      Exit;
    end;
  end;
  
  dmgMain.qryExec.SQL.Text := 
    'SELECT id, username, rol FROM ge_usuarios ' +
    'WHERE LOWER(username) = LOWER(:u) ' +
    'AND password_hash = :p ' +
    'AND activo = 1';
  dmgMain.qryExec.ParamByName('u').AsString := edtUser.Text;
  dmgMain.qryExec.ParamByName('p').AsString := edtPass.Text; 
  dmgMain.qryExec.Open;
  
  if not dmgMain.qryExec.IsEmpty then
  begin
    FIsAuthenticated := True;
    dmgMain.CurrentUserId := TdmgMain.CleanUUID(dmgMain.qryExec.FieldByName('id').AsString);
    FLoggedUser := dmgMain.qryExec.FieldByName('username').AsString;
    FLoggedRole := dmgMain.qryExec.FieldByName('rol').AsString;
    
    // Guardar último usuario en configuración
    try
      var LPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'db_config.ini';
      var LIni := TIniFile.Create(LPath);
      try
        LIni.WriteString('Login', 'LastUser', FLoggedUser);
      finally
        LIni.Free;
      end;
    except
      // Ignorar fallos de escritura de configuración
    end;
    
    ModalResult := mrOk;
  end
  else
  begin
    lblError.Caption := 'Usuario o clave incorrectos';
    lblError.Visible := True;
  end;
  
  dmgMain.qryExec.Close;
end;

procedure TfrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not FIsAuthenticated then
    Application.Terminate;
end;

procedure TfrmLogin.FormShow(Sender: TObject);
var
  LLogoPath: string;
  LIni: TIniFile;
  LPath: string;
begin
  // Ajustar fondo a gris claro como pidió el usuario
  pnlBackground.Color := TAppTheme.COLOR_SOFT_GRAY;
  
  // Cargar Logo dinámicamente
  LLogoPath := ExtractFilePath(ParamStr(0)) + 'logo_raul.png';
  if FileExists(LLogoPath) then
    imgLogo.Picture.LoadFromFile(LLogoPath);

  // Intentar cargar último usuario guardado
  LPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'db_config.ini';
  if FileExists(LPath) then
  begin
    LIni := TIniFile.Create(LPath);
    try
      edtUser.Text := LIni.ReadString('Login', 'LastUser', '');
      if edtUser.Text <> '' then
      begin
        // Poner foco en el campo de contraseña
        ActiveControl := edtPass;
      end;
    finally
      LIni.Free;
    end;
  end;
end;

end.
