﻿unit frm_Empresas;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.UITypes, 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
  TfrmEmpresas = class(TfrmBaseList)
    btnActivar: TSpeedButton;
    btnFormasPago: TSpeedButton;
    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;
    procedure btnActivarClick(Sender: TObject);
    procedure btnFormasPagoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmEmpresas: TfrmEmpresas;

implementation

uses
  dmg_Main, frm_EmpresasEditor, frm_FormasPago, uDbErrorHandler, frm_Main;

{$R *.dfm}

procedure TfrmEmpresas.FormShow(Sender: TObject);
begin
  inherited;
  frmEmpresas := Self;
  OnDestroy := FormDestroy;
  pnlSearch.Visible := True;
  lblSearch.Caption := 'Buscar Empresa:';
end;

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

procedure TfrmEmpresas.btnRefreshClick(Sender: TObject);
var
  LSql: string;
begin
  FQryMain.Close;
  LSql := 'SELECT id, nombre, cif_nif, direccion, activo FROM ge_empresas ';
  
  if Trim(edtSearch.Text) <> '' then
  begin
    LSql := LSql + 'WHERE nombre LIKE :search OR cif_nif LIKE :search ';
  end;
  LSql := LSql + 'ORDER BY nombre';
  
  FQryMain.SQL.Text := LSql;
  
  if Trim(edtSearch.Text) <> '' then
    FQryMain.ParamByName('search').AsString := '%' + Trim(edtSearch.Text) + '%';
    
  FQryMain.Open;
  
  dbGridMain.Columns.Clear;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'nombre';
    Title.Caption := 'Nombre Empresa';
    Width := 300;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'cif_nif';
    Title.Caption := 'CIF / NIF';
    Width := 120;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'direccion';
    Title.Caption := 'Dirección';
    Width := 350;
  end;
  with dbGridMain.Columns.Add do
  begin
    FieldName := 'activo';
    Title.Caption := 'Activo';
    Width := 70;
  end;
end;

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

procedure TfrmEmpresas.btnNewClick(Sender: TObject);
begin
  if not Assigned(frmEmpresasEditor) then
    Application.CreateForm(TfrmEmpresasEditor, frmEmpresasEditor);
  
  frmEmpresasEditor.ParentForm := Self;
  frmEmpresasEditor.CompanyId := '';
  if frmEmpresasEditor.ShowModal = mrOk then
    btnRefreshClick(nil);
end;

procedure TfrmEmpresas.btnDeleteClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;
  
  if MessageDlg('¿Está seguro de que desea eliminar esta empresa?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    try
      dmgMain.qryExec.Close;
      dmgMain.qryExec.SQL.Text := 'DELETE FROM ge_empresas WHERE id = :id';
      dmgMain.qryExec.ParamByName('id').AsString := FQryMain.FieldByName('id').AsString;
      dmgMain.qryExec.ExecSQL;
      btnRefreshClick(nil);
    except
      on E: Exception do
        TDbErrorHandler.HandleException(E, 'Error al eliminar la empresa');
    end;
  end;
end;

procedure TfrmEmpresas.btnActivarClick(Sender: TObject);
begin
  if FQryMain.IsEmpty then Exit;

  if FQryMain.FieldByName('activo').AsInteger = 0 then
  begin
    ShowMessage('No se puede seleccionar una empresa inactiva.');
    Exit;
  end;

  if MessageDlg('¿Desea activar la empresa "' + FQryMain.FieldByName('nombre').AsString + '"? Se cerrarán todos los formularios abiertos.',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    dmgMain.CurrentCompanyId := TdmgMain.CleanUUID(FQryMain.FieldByName('id').AsString);
    dmgMain.CurrentCompanyName := FQryMain.FieldByName('nombre').AsString;
    
    // Actualizar visualmente frmMain
    frmMain.Caption := 'Gestión - ' + dmgMain.CurrentCompanyName;
    frmMain.StatusBar1.Panels[2].Text := 'Empresa: ' + dmgMain.CurrentCompanyName;
    
    // Mandar mensaje asíncrono para cerrar los formularios de forma segura
    PostMessage(frmMain.Handle, WM_RESET_WORKSPACE, 0, 0);
  end;
end;

procedure TfrmEmpresas.btnFormasPagoClick(Sender: TObject);
begin
  if Assigned(frmMain) then
    frmMain.OpenFormInTab(TfrmFormasPago, 'Formas de Pago')
  else
  begin
    if not Assigned(frmFormasPago) then
      Application.CreateForm(TfrmFormasPago, frmFormasPago);
    frmFormasPago.Show;
  end;
end;

end.
