unit frm_PlantaAmasado;

interface

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

type
  TfrmPlantaAmasado = class(TForm)
    pnlTop: TPanel;
    lblTitulo: TLabel;
    lblSubtitulo: TLabel;
    pnlCenter: TPanel;
    pnlFaseInicio: TPanel;
    lblFaseInicio: TLabel;
    lblTempObrador: TLabel;
    edtTempObrador: TEdit;
    btnComenzarAmasado: TButton;
    lblHoraInicioInfo: TLabel;
    pnlCrono: TPanel;
    lblCronoTitulo: TLabel;
    lblCronoTiempo: TLabel;
    lblTiempoObjetivo: TLabel;
    pnlFaseFin: TPanel;
    lblFaseFin: TLabel;
    lblTempFinal: TLabel;
    edtTempFinal: TEdit;
    chkOkVisual: TCheckBox;
    lblObservaciones: TLabel;
    edtObservaciones: TEdit;
    btnFinalizarAmasado: TButton;
    tmrCrono: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure btnComenzarAmasadoClick(Sender: TObject);
    procedure btnFinalizarAmasadoClick(Sender: TObject);
    procedure tmrCronoTimer(Sender: TObject);
  private
    FElabGuid: string;
    FRecetaNombre: string;
    FDuracionObjetivoMin: Integer;
    FHoraInicio: TDateTime;
    FIniciado: Boolean;
  public
    class function ControlarAmasado(
      const AElabGuid: string;
      const ARecetaNombre: string;
      ADuracionObjetivoMin: Integer
    ): Boolean;
  end;

implementation

uses
  System.DateUtils;

{$R *.dfm}

class function TfrmPlantaAmasado.ControlarAmasado(
  const AElabGuid: string;
  const ARecetaNombre: string;
  ADuracionObjetivoMin: Integer
): Boolean;
var
  LFrm: TfrmPlantaAmasado;
begin
  LFrm := TfrmPlantaAmasado.Create(Application);
  try
    LFrm.FElabGuid := AElabGuid;
    LFrm.FRecetaNombre := ARecetaNombre;
    LFrm.FDuracionObjetivoMin := ADuracionObjetivoMin;

    LFrm.lblTitulo.Caption := Format('CONTROL DE AMASADO: %s', [ARecetaNombre]);
    if ADuracionObjetivoMin > 0 then
      LFrm.lblTiempoObjetivo.Caption := Format('Tiempo sugerido por receta: %d minutos', [ADuracionObjetivoMin])
    else
      LFrm.lblTiempoObjetivo.Caption := 'Tiempo sugerido: Variable según textura';

    Result := (LFrm.ShowModal = mrOk);
  finally
    LFrm.Free;
  end;
end;

procedure TfrmPlantaAmasado.FormCreate(Sender: TObject);
begin
  Tag := 999;
  FIniciado := False;
  lblCronoTiempo.Caption := '00:00';
  btnFinalizarAmasado.Enabled := False;
end;

procedure TfrmPlantaAmasado.btnComenzarAmasadoClick(Sender: TObject);
var
  LTempAmb: Double;
begin
  LTempAmb := StrToFloatDef(StringReplace(edtTempObrador.Text, ',', '.', [rfReplaceAll]), 21.0);
  FHoraInicio := Now;
  FIniciado := True;

  dmLocalData.ExecLocalSQL(
    'UPDATE local_elaboraciones SET ' +
    '  hora_inicio = ?, temp_obrador = ?, estado = ''EN_AMASADO'', sync_status = ''PENDING'' ' +
    'WHERE local_guid = ?',
    [FormatDateTime('hh:nn:ss', FHoraInicio), LTempAmb, FElabGuid]
  );

  lblHoraInicioInfo.Caption := Format('Iniciado a las %s', [FormatDateTime('hh:nn:ss', FHoraInicio)]);
  btnComenzarAmasado.Enabled := False;
  edtTempObrador.Enabled := False;

  btnFinalizarAmasado.Enabled := True;
  tmrCrono.Enabled := True;
  pnlCrono.Color := $00E1FBE1; // Verde suave
end;

procedure TfrmPlantaAmasado.tmrCronoTimer(Sender: TObject);
var
  LSegundos: Int64;
  LMin, LSeg: Integer;
begin
  if not FIniciado then Exit;

  LSegundos := SecondsBetween(Now, FHoraInicio);
  LMin := LSegundos div 60;
  LSeg := LSegundos mod 60;

  lblCronoTiempo.Caption := Format('%.2d:%.2d', [LMin, LSeg]);
end;

procedure TfrmPlantaAmasado.btnFinalizarAmasadoClick(Sender: TObject);
var
  LHoraFin: TDateTime;
  LMinutosReales: Integer;
  LTempFinal: Double;
  LOkVisual: Integer;
begin
  LHoraFin := Now;
  tmrCrono.Enabled := False;
  LMinutosReales := MinutesBetween(LHoraFin, FHoraInicio);
  if LMinutosReales = 0 then LMinutosReales := 1;

  LTempFinal := StrToFloatDef(StringReplace(edtTempFinal.Text, ',', '.', [rfReplaceAll]), 24.0);
  if chkOkVisual.Checked then
    LOkVisual := 1
  else
    LOkVisual := 0;

  dmLocalData.ExecLocalSQL(
    'UPDATE local_elaboraciones SET ' +
    '  hora_fin = ?, temp_masa_final = ?, tiempo_real_minutos = ?, ' +
    '  ok_visual = ?, observaciones = ?, estado = ''FINALIZADA'', sync_status = ''PENDING'' ' +
    'WHERE local_guid = ?',
    [FormatDateTime('hh:nn:ss', LHoraFin), LTempFinal, LMinutosReales,
     LOkVisual, edtObservaciones.Text, FElabGuid]
  );

  ShowMessage(
    Format('¡Amasado finalizado y registrado!' + sLineBreak + sLineBreak +
           'Duración total: %d min' + sLineBreak +
           'Temperatura masa: %.1f ºC' + sLineBreak +
           'La orden se encuentra lista y encolada para sincronización.',
           [LMinutosReales, LTempFinal])
  );

  ModalResult := mrOk;
end;

end.
