﻿unit uReglasArchivadoForm;

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.Grids, Vcl.DBGrids,
  Vcl.DBCtrls, Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Intf, FireDAC.Stan.Option, 
  FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, uDM,
  FireDAC.Comp.DataSet, Vcl.Mask, FireDAC.Stan.Param, FireDAC.Stan.Error,
  FireDAC.DatS, FireDAC.Phys.Intf, System.UITypes;

type
  TfrmReglasArchivado = class(TForm)
    pnlBottom: TPanel;
    btnCerrar: TButton;
    DataSourceReglas: TDataSource;
    QueryReglas: TFDQuery;
    pnlTop: TPanel;
    btnActualizarEstructuras: TButton;
    MemoLog: TMemo;
    Splitter1: TSplitter;
    pnlMain: TPanel;
    pnlLeft: TPanel;
    DBGridList: TDBGrid;
    Splitter2: TSplitter;
    pnlDetails: TPanel;
    Label1: TLabel;
    edCarpeta: TDBEdit;
    Label2: TLabel;
    edProposito: TDBEdit;
    Label3: TLabel;
    edTablas: TDBEdit;
    Label4: TLabel;
    edCampoDoc: TDBEdit;
    chkAnyos: TDBCheckBox;
    chkDatos: TDBCheckBox;
    chkDoc: TDBCheckBox;
    Label5: TLabel;
    memPrompt: TDBMemo;
    btnNuevo: TButton;
    btnEliminar: TButton;
    LabelRequisitos: TLabel;
    memRequisitos: TDBMemo;
    LabelEstructura: TLabel;
    memEstructura: TDBMemo;
    procedure btnCerrarClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnActualizarEstructurasClick(Sender: TObject);
    procedure QueryReglasAfterPost(DataSet: TDataSet);
    procedure btnNuevoClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
    procedure DBGridListDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGridListCellClick(Column: TColumn);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmReglasArchivado: TfrmReglasArchivado;

implementation

uses uConfig;

{$R *.dfm}

procedure TfrmReglasArchivado.btnActualizarEstructurasClick(Sender: TObject);
var
  CurrID: Integer;
begin
  CurrID := 0;
  if not QueryReglas.IsEmpty then
    CurrID := QueryReglas.FieldByName('id').AsInteger;

  MemoLog.Lines.Add('Iniciando actualización de estructuras y prompts...');
  try
    DM.ActualizarEstructurasConfig(True);
    QueryReglas.Close;
    QueryReglas.Open;
    
    if CurrID > 0 then
      QueryReglas.Locate('id', CurrID, []);
      
    MemoLog.Lines.Add('Proceso completado con éxito.');
  except
    on E: Exception do
      MemoLog.Lines.Add('ERROR: ' + E.Message);
  end;
end;

procedure TfrmReglasArchivado.btnCerrarClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmReglasArchivado.FormShow(Sender: TObject);
begin
  QueryReglas.Connection := DM.FDConnection;
  QueryReglas.Open;
end;

procedure TfrmReglasArchivado.QueryReglasAfterPost(DataSet: TDataSet);
begin
  // Forzar que el prompt se regenere si se cambió el propósito o tablas
  if not (QueryReglas.State in [dsInsert, dsEdit]) then
    btnActualizarEstructurasClick(nil);
end;

procedure TfrmReglasArchivado.DBGridListDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  CheckFlag: Integer;
  R: TRect;
begin
  if (Column.Field <> nil) and 
     ((Column.FieldName = 'separar_anyos') or 
      (Column.FieldName = 'insertar_datos') or 
      (Column.FieldName = 'insertar_documento')) then
  begin
    DBGridList.Canvas.FillRect(Rect);
    CheckFlag := 0;
    if Column.Field.AsInteger = 1 then
      CheckFlag := DFCS_CHECKED;

    R := Rect;
    InflateRect(R, -2, -2);
    DrawFrameControl(DBGridList.Canvas.Handle, R, DFC_BUTTON, DFCS_BUTTONCHECK or CheckFlag);
  end
  else
    DBGridList.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure TfrmReglasArchivado.DBGridListCellClick(Column: TColumn);
begin
  if (Column.FieldName = 'separar_anyos') or 
     (Column.FieldName = 'insertar_datos') or 
     (Column.FieldName = 'insertar_documento') then
  begin
    QueryReglas.Edit;
    if Column.Field.AsInteger = 1 then
      Column.Field.AsInteger := 0
    else
      Column.Field.AsInteger := 1;
    QueryReglas.Post;
  end;
end;

procedure TfrmReglasArchivado.btnEliminarClick(Sender: TObject);
begin
  if not QueryReglas.IsEmpty then
  begin
    if MessageDlg('¿Está seguro de que desea eliminar esta regla?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
      QueryReglas.Delete;
  end;
end;

procedure TfrmReglasArchivado.btnNuevoClick(Sender: TObject);
begin
  QueryReglas.Append;
  edCarpeta.SetFocus;
end;

end.
