unit frm_CalidadIncidenciasList;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, frm_BaseList, Data.DB,
  Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls,
  FireDAC.Comp.Client, dmg_Calidad, dmg_Main;

type
  TfrmCalidadIncidenciasList = class(TfrmBaseList)
    cboEstadoFilter: TComboBox;
    grpGravedad: TGroupBox;
    cboGravedadFilter: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ComboFilterChange(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject); override;
    procedure btnNewClick(Sender: TObject); override;
    procedure btnEditClick(Sender: TObject); override;
    procedure btnDeleteClick(Sender: TObject); override;
  private
    { Private declarations }
  protected
    procedure ApplyAllFilters; override;
  public
    { Public declarations }
  end;

var
  frmCalidadIncidenciasList: TfrmCalidadIncidenciasList;

implementation

{$R *.dfm}

uses
  frm_CalidadIncidenciasEditor;

procedure TfrmCalidadIncidenciasList.FormCreate(Sender: TObject);
begin
  DateFilterField := 'fecha_deteccion';

  if not Assigned(dmgCalidad) then
    Application.CreateForm(TdmgCalidad, dmgCalidad);

  FQryMain := dmgCalidad.qryIncidencias;
  if Assigned(FQryMain) and (Trim(FQryMain.SQL.Text) = '') then
  begin
    FQryMain.SQL.Text :=
      'SELECT i.*, COALESCE(u.nombre_completo, u.username) as nombre_usuario ' +
      'FROM ge_calidad_incidencias i ' +
      'LEFT JOIN ge_usuarios u ON i.id_usuario_reporta = u.id ' +
      'ORDER BY i.fecha_deteccion DESC';
  end;

  dsMain.DataSet := FQryMain;
  inherited;
end;

procedure TfrmCalidadIncidenciasList.FormShow(Sender: TObject);
begin
  inherited FormShow(Sender);

  pnlLeftFilter.Visible := True;
  pnlLeftFilter.Width := 195;
  grpStatuses.Visible := True;
  grpGravedad.Visible := True;
  grpDates.Visible := True;

  if Assigned(cboEstadoFilter) and (cboEstadoFilter.ItemIndex < 0) then
    cboEstadoFilter.ItemIndex := 0;

  if Assigned(cboGravedadFilter) and (cboGravedadFilter.ItemIndex < 0) then
    cboGravedadFilter.ItemIndex := 0;

  ApplyAllFilters;
end;

procedure TfrmCalidadIncidenciasList.ComboFilterChange(Sender: TObject);
begin
  ApplyAllFilters;
end;

procedure TfrmCalidadIncidenciasList.btnRefreshClick(Sender: TObject);
begin
  if Assigned(FQryMain) then
  begin
    if Trim(FQryMain.SQL.Text) = '' then
    begin
      FQryMain.SQL.Text :=
        'SELECT i.*, COALESCE(u.nombre_completo, u.username) as nombre_usuario ' +
        'FROM ge_calidad_incidencias i ' +
        'LEFT JOIN ge_usuarios u ON i.id_usuario_reporta = u.id ' +
        'ORDER BY i.fecha_deteccion DESC';
    end;
    FQryMain.Close;
    FQryMain.Open;
  end;
  inherited;
end;

procedure TfrmCalidadIncidenciasList.ApplyAllFilters;
var
  FilterParts: TStringList;
  I: Integer;
  StatusPart, GravedadPart, DatePart, SearchPart, FinalFilter: string;
  DateLimit: TDateTime;
begin
  if not Assigned(FQryMain) or not FQryMain.Active then Exit;

  FilterParts := TStringList.Create;
  try
    // 1. Búsqueda por Texto Libre
    if Assigned(edtSearch) and (Trim(edtSearch.Text) <> '') then
    begin
      SearchPart := Format('(codigo_nc LIKE %s OR fase_proceso LIKE %s OR descripcion_desviacion LIKE %s OR accion_inmediata LIKE %s)',
        [QuotedStr('%' + edtSearch.Text + '%'), QuotedStr('%' + edtSearch.Text + '%'),
         QuotedStr('%' + edtSearch.Text + '%'), QuotedStr('%' + edtSearch.Text + '%')]);
      FilterParts.Add(SearchPart);
    end;

    // 2. Filtro por Desplegable de Estado
    if Assigned(cboEstadoFilter) and (cboEstadoFilter.ItemIndex > 0) then
    begin
      StatusPart := '(estado = ' + QuotedStr(cboEstadoFilter.Text) + ')';
      FilterParts.Add(StatusPart);
    end;

    // 3. Filtro por Desplegable de Gravedad
    if Assigned(cboGravedadFilter) and (cboGravedadFilter.ItemIndex > 0) then
    begin
      GravedadPart := '(gravedad = ' + QuotedStr(cboGravedadFilter.Text) + ')';
      FilterParts.Add(GravedadPart);
    end;

    // 4. Filtro por Fechas (fecha_deteccion)
    if Assigned(rbDateAll) and not rbDateAll.Checked then
    begin
      DatePart := '';
      if rbDateToday.Checked then
      begin
        DateLimit := Date;
        DatePart := 'fecha_deteccion >= {d ' + FormatDateTime('yyyy-mm-dd', DateLimit) + '}';
      end
      else if rbDateWeek.Checked then
      begin
        DateLimit := Date - 7;
        DatePart := 'fecha_deteccion >= {d ' + FormatDateTime('yyyy-mm-dd', DateLimit) + '}';
      end
      else if rbDateMonth.Checked then
      begin
        DateLimit := IncMonth(Date, -1);
        DatePart := 'fecha_deteccion >= {d ' + FormatDateTime('yyyy-mm-dd', DateLimit) + '}';
      end
      else if rbDateCustom.Checked then
      begin
        DatePart := '(fecha_deteccion >= {d ' + FormatDateTime('yyyy-mm-dd', Trunc(dtpStart.Date)) + '}' +
                    ' AND fecha_deteccion < {d ' + FormatDateTime('yyyy-mm-dd', Trunc(dtpEnd.Date) + 1) + '})';
      end;

      if DatePart <> '' then
        FilterParts.Add(DatePart);
    end;

    // Concatenación final de Filtros
    FinalFilter := '';
    for I := 0 to FilterParts.Count - 1 do
    begin
      if FinalFilter <> '' then
        FinalFilter := FinalFilter + ' AND ';
      FinalFilter := FinalFilter + FilterParts[I];
    end;

    FQryMain.Filter := FinalFilter;
    FQryMain.Filtered := (FinalFilter <> '');
  finally
    FilterParts.Free;
  end;
end;

procedure TfrmCalidadIncidenciasList.btnNewClick(Sender: TObject);
var
  LEditor: TfrmCalidadIncidenciasEditor;
begin
  LEditor := TfrmCalidadIncidenciasEditor.Create(Self);
  try
    LEditor.IncidenciaId := 0;
    if LEditor.ShowModal = mrOk then
      btnRefreshClick(nil);
  finally
    LEditor.Free;
  end;
end;

procedure TfrmCalidadIncidenciasList.btnEditClick(Sender: TObject);
var
  LEditor: TfrmCalidadIncidenciasEditor;
  LId: Integer;
begin
  if not Assigned(FQryMain) or FQryMain.IsEmpty then Exit;

  LId := FQryMain.FieldByName('id').AsInteger;
  LEditor := TfrmCalidadIncidenciasEditor.Create(Self);
  try
    LEditor.IncidenciaId := LId;
    if LEditor.ShowModal = mrOk then
      btnRefreshClick(nil);
  finally
    LEditor.Free;
  end;
end;

procedure TfrmCalidadIncidenciasList.btnDeleteClick(Sender: TObject);
var
  LId: Integer;
begin
  if not Assigned(FQryMain) or FQryMain.IsEmpty then Exit;

  if MessageDlg('¿Está seguro de eliminar esta hoja de No Conformidad (RG-11)?',
                mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    LId := FQryMain.FieldByName('id').AsInteger;
    dmgCalidad.qryExecCalidad.Close;
    dmgCalidad.qryExecCalidad.SQL.Text := 'DELETE FROM ge_calidad_incidencias WHERE id = :id';
    dmgCalidad.qryExecCalidad.ParamByName('id').AsInteger := LId;
    dmgCalidad.qryExecCalidad.ExecSQL;
    btnRefreshClick(nil);
  end;
end;

end.
