﻿unit uDecaConfiguracion;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  uDecaConfig;

type
  TfDecaConfiguracion = class(TForm)
    pnlHeader: TPanel;
    lblTitulo: TLabel;
    lblSubtitulo: TLabel;
    grpModo: TGroupBox;
    rbRemoto: TRadioButton;
    rbLocal: TRadioButton;
    grpRemoto: TGroupBox;
    lblUrl: TLabel;
    edtUrlServicio: TEdit;
    lblApiKey: TLabel;
    edtApiKey: TEdit;
    lblTimeout: TLabel;
    edtTimeout: TEdit;
    lblNotaApi: TLabel;
    grpLocal: TGroupBox;
    lblRutaPhp: TLabel;
    edtRutaPhp: TEdit;
    btnBuscarPhp: TButton;
    lblRutaScript: TLabel;
    edtRutaScript: TEdit;
    btnBuscarScript: TButton;
    pnlStatus: TPanel;
    lblEstadoTest: TLabel;
    pnlFooter: TPanel;
    btnProbarConexion: TButton;
    btnGuardar: TButton;
    btnCancelar: TButton;
    dlgOpenFile: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure rbModoClick(Sender: TObject);
    procedure btnBuscarPhpClick(Sender: TObject);
    procedure btnBuscarScriptClick(Sender: TObject);
    procedure btnProbarConexionClick(Sender: TObject);
    procedure btnGuardarClick(Sender: TObject);
    procedure btnCancelarClick(Sender: TObject);
  private
    FConfig: TDecaConfig;
    procedure CargarDatosEnPantalla;
    procedure LeerDatosDePantalla(out AConfig: TDecaConfig);
    procedure ActualizarHabilitacionModo;
  public
    class function EjecutarConfiguracion(AOwner: TComponent): Boolean;
  end;

var
  fDecaConfiguracion: TfDecaConfiguracion;

implementation

{$R *.dfm}

class function TfDecaConfiguracion.EjecutarConfiguracion(AOwner: TComponent): Boolean;
var
  LFrm: TfDecaConfiguracion;
begin
  LFrm := TfDecaConfiguracion.Create(AOwner);
  try
    Result := LFrm.ShowModal = mrOk;
  finally
    LFrm.Free;
  end;
end;

procedure TfDecaConfiguracion.FormCreate(Sender: TObject);
begin
  CargarDecaConfig(FConfig);
  CargarDatosEnPantalla;
end;

procedure TfDecaConfiguracion.CargarDatosEnPantalla;
begin
  rbRemoto.Checked := (FConfig.Modo = dmRemotoApi);
  rbLocal.Checked := (FConfig.Modo = dmLocalCli);

  edtUrlServicio.Text := FConfig.UrlServicio;
  edtApiKey.Text := FConfig.ApiKey;
  edtTimeout.Text := IntToStr(FConfig.TimeoutSeg);

  edtRutaPhp.Text := FConfig.RutaPhp;
  edtRutaScript.Text := FConfig.RutaScriptCli;

  ActualizarHabilitacionModo;
end;

procedure TfDecaConfiguracion.LeerDatosDePantalla(out AConfig: TDecaConfig);
begin
  AConfig := FConfig;

  if rbLocal.Checked then
    AConfig.Modo := dmLocalCli
  else
    AConfig.Modo := dmRemotoApi;

  AConfig.UrlServicio := Trim(edtUrlServicio.Text);
  AConfig.ApiKey := Trim(edtApiKey.Text);
  AConfig.TimeoutSeg := StrToIntDef(Trim(edtTimeout.Text), 30);
  if AConfig.TimeoutSeg <= 5 then AConfig.TimeoutSeg := 5;

  AConfig.RutaPhp := Trim(edtRutaPhp.Text);
  AConfig.RutaScriptCli := Trim(edtRutaScript.Text);
end;

procedure TfDecaConfiguracion.ActualizarHabilitacionModo;
begin
  grpRemoto.Enabled := rbRemoto.Checked;
  grpLocal.Enabled := rbLocal.Checked;

  if rbRemoto.Checked then
  begin
    grpRemoto.Color := clBtnFace;
    grpLocal.Color := clBtnFace;
  end;
end;

procedure TfDecaConfiguracion.rbModoClick(Sender: TObject);
begin
  ActualizarHabilitacionModo;
end;

procedure TfDecaConfiguracion.btnBuscarPhpClick(Sender: TObject);
begin
  dlgOpenFile.Title := 'Seleccionar int'#233'rprete php.exe';
  dlgOpenFile.Filter := 'Ejecutable PHP (php.exe)|php.exe|Todos los archivos (*.*)|*.*';
  dlgOpenFile.FileName := edtRutaPhp.Text;
  if dlgOpenFile.Execute then
    edtRutaPhp.Text := dlgOpenFile.FileName;
end;

procedure TfDecaConfiguracion.btnBuscarScriptClick(Sender: TObject);
begin
  dlgOpenFile.Title := 'Seleccionar script cli_emitir.php';
  dlgOpenFile.Filter := 'Script PHP (cli_emitir.php)|*.php|Todos los archivos (*.*)|*.*';
  dlgOpenFile.FileName := edtRutaScript.Text;
  if dlgOpenFile.Execute then
    edtRutaScript.Text := dlgOpenFile.FileName;
end;

procedure TfDecaConfiguracion.btnProbarConexionClick(Sender: TObject);
var
  LConfigTest: TDecaConfig;
  LInfoEmpresa, LErrorMsg: string;
begin
  LeerDatosDePantalla(LConfigTest);

  lblEstadoTest.Caption := 'Comprobando comunicaci'#243'n...';
  lblEstadoTest.Font.Color := clNavy;
  Update;
  Screen.Cursor := crHourGlass;
  try
    if ProbarConexionDeca(LConfigTest, LInfoEmpresa, LErrorMsg) then
    begin
      lblEstadoTest.Caption := '[OK] Conexi'#243'n verificada exitosamente con el servicio DeCA.';
      lblEstadoTest.Font.Color := clGreen;
      ShowMessage('Conexi'#243'n establecida con '#233'xito.'#13#10#13#10 +
        'Servicio: ' + LConfigTest.UrlServicio + #13#10 +
        'Detalle: ' + LInfoEmpresa);
    end
    else
    begin
      lblEstadoTest.Caption := '[ERROR] No se pudo verificar la conexi'#243'n.';
      lblEstadoTest.Font.Color := clRed;
      ShowMessage('Error de verificaci'#243'n de conexi'#243'n DeCA.'#13#10#13#10 +
        'Motivo: ' + LErrorMsg);
    end;
  finally
    Screen.Cursor := crDefault;
  end;
end;

procedure TfDecaConfiguracion.btnGuardarClick(Sender: TObject);
var
  LConfigToSave: TDecaConfig;
begin
  LeerDatosDePantalla(LConfigToSave);

  if (LConfigToSave.Modo = dmRemotoApi) and (LConfigToSave.UrlServicio = '') then
  begin
    ShowMessage('Debe indicar la URL del servicio DeCA para el modo Web / Cloud.');
    edtUrlServicio.SetFocus;
    Exit;
  end;

  if (LConfigToSave.Modo = dmRemotoApi) and (LConfigToSave.ApiKey = '') then
  begin
    ShowMessage('Debe indicar la API Key para la autenticaci'#243'n en el modo Web / Cloud.');
    edtApiKey.SetFocus;
    Exit;
  end;

  if GuardarDecaConfig(LConfigToSave) then
  begin
    FConfig := LConfigToSave;
    ShowMessage('Configuraci'#243'n guardada y cifrada correctamente en deca.ini.');
    ModalResult := mrOk;
  end
  else
    ShowMessage('No se pudo guardar la configuraci'#243'n en el archivo deca.ini.');
end;

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

end.
