unit frm_DbConfig;

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;

type
  TfrmDbConfig = class(TForm)
    pnlMain: TPanel;
    lblTitle: TLabel;
    lblServer: TLabel;
    edtServer: TEdit;
    lblPort: TLabel;
    edtPort: TEdit;
    lblDatabase: TLabel;
    edtDatabase: TEdit;
    lblUser: TLabel;
    edtUser: TEdit;
    lblPassword: TLabel;
    edtPassword: TEdit;
    lblDriver: TLabel;
    cbDriver: TComboBox;
    btnProbar: TBitBtn;
    btnGuardar: TBitBtn;
    btnCancelar: TBitBtn;
    procedure FormShow(Sender: TObject);
    procedure btnProbarClick(Sender: TObject);
    procedure btnGuardarClick(Sender: TObject);
    procedure btnCancelarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmDbConfig: TfrmDbConfig;

implementation

uses
  dmg_Main, uAppTheme, FireDAC.Comp.Client;

{$R *.dfm}

procedure TfrmDbConfig.FormShow(Sender: TObject);
var
  LIni: TStringList;
  LPath: string;
begin
  TAppTheme.ApplyToForm(Self);
  Font.Size := 10;
  Font.Height := -13;

  // Load existing parameters if they exist
  if dmgMain.HasConfig then
  begin
    dmgMain.LoadConfig;
    edtServer.Text := dmgMain.dbConn.Params.Values['Server'];
    edtPort.Text := dmgMain.dbConn.Params.Values['Port'];
    edtDatabase.Text := dmgMain.dbConn.Params.Values['Database'];
    edtUser.Text := dmgMain.dbConn.Params.Values['User_Name'];
    edtPassword.Text := dmgMain.dbConn.Params.Values['Password'];
    
    if SameText(dmgMain.dbConn.Params.Values['DriverID'], 'PostgreSQL') then
      cbDriver.ItemIndex := 1
    else
      cbDriver.ItemIndex := 0;
  end
  else
  begin
    // Defaults
    edtServer.Text := '85.215.144.168';
    edtPort.Text := '3306';
    edtDatabase.Text := 'pastelerias';
    edtUser.Text := 'asesoft';
    edtPassword.Text := 'Pantera1';
    cbDriver.ItemIndex := 0; // MySQL
  end;
end;

procedure TfrmDbConfig.btnProbarClick(Sender: TObject);
var
  LTestConn: TFDConnection;
begin
  LTestConn := TFDConnection.Create(nil);
  try
    LTestConn.DriverName := cbDriver.Text;
    LTestConn.Params.Values['Server'] := Trim(edtServer.Text);
    LTestConn.Params.Values['Port'] := Trim(edtPort.Text);
    LTestConn.Params.Values['Database'] := Trim(edtDatabase.Text);
    LTestConn.Params.Values['User_Name'] := Trim(edtUser.Text);
    LTestConn.Params.Values['Password'] := Trim(edtPassword.Text);
    LTestConn.Params.Values['CharacterSet'] := 'utf8mb4';
    LTestConn.LoginPrompt := False;
    
    try
      LTestConn.Connected := True;
      LTestConn.Connected := False;
      MessageDlg('¡Conexión probada con éxito!', mtInformation, [mbOK], 0);
    except
      on E: Exception do
        MessageDlg('Error al conectar con la Base de Datos:'#13#10 + E.Message, mtError, [mbOK], 0);
    end;
  finally
    LTestConn.Free;
  end;
end;

procedure TfrmDbConfig.btnGuardarClick(Sender: TObject);
begin
  if Trim(edtServer.Text) = '' then
  begin
    ShowMessage('El Host/Servidor es obligatorio.');
    Exit;
  end;
  if Trim(edtDatabase.Text) = '' then
  begin
    ShowMessage('El nombre de la Base de Datos es obligatorio.');
    Exit;
  end;
  if Trim(edtUser.Text) = '' then
  begin
    ShowMessage('El Usuario es obligatorio.');
    Exit;
  end;

  dmgMain.SaveConfig(
    Trim(edtServer.Text),
    Trim(edtPort.Text),
    Trim(edtDatabase.Text),
    Trim(edtUser.Text),
    Trim(edtPassword.Text),
    cbDriver.Text
  );

  ModalResult := mrOk;
end;

procedure TfrmDbConfig.btnCancelarClick(Sender: TObject);
begin
  ModalResult := mrCancel;
  Close;
end;

end.
