﻿unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Menus, uConfigForm, uConfig, uDM, uWatchdog, uLogProcesos;

type
  TfrmMain = class(TForm)
    TrayIcon: TTrayIcon;
    PopupMenu: TPopupMenu;
    itemConfig: TMenuItem;
    itemLog: TMenuItem;
    itemSync: TMenuItem;
    N1: TMenuItem;
    itemSalir: TMenuItem;
    TimerAnim: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure itemSalirClick(Sender: TObject);
    procedure itemConfigClick(Sender: TObject);
    procedure itemLogClick(Sender: TObject);
    procedure itemSyncClick(Sender: TObject);
    procedure TrayIconDblClick(Sender: TObject);
  private
    FWatchdog: TDirectoryWatchdog;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.ShowMainForm := False;
  Visible := False;
  
  // Asignar el icono de la aplicación al TrayIcon para que sea visible
  TrayIcon.Icon := Application.Icon;
  
  FWatchdog := TDirectoryWatchdog.Create;
  
  TrayIcon.Visible := True;
  TrayIcon.Hint := 'Gestión Documental Activa';
  TrayIcon.BalloonTitle := 'Gestión Documental';
  TrayIcon.BalloonHint := 'El sistema de monitoreo se ha iniciado correctamente.';
  TrayIcon.ShowBalloonHint;
end;

procedure TfrmMain.TrayIconDblClick(Sender: TObject);
begin
  itemConfigClick(Sender);
end;

procedure TfrmMain.itemConfigClick(Sender: TObject);
begin
  if not Assigned(frmConfig) then
    frmConfig := TfrmConfig.Create(Application);
  frmConfig.ShowModal;
end;

procedure TfrmMain.itemLogClick(Sender: TObject);
begin
  if not Assigned(frmLogProcesos) then
    frmLogProcesos := TfrmLogProcesos.Create(Application);
  frmLogProcesos.Show;
end;

procedure TfrmMain.itemSalirClick(Sender: TObject);
begin
  if MessageDlg('¿Desea cerrar el sistema de gestión documental?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    TrayIcon.Visible := False;
    
    // Señalizar al hilo que debe detenerse
    if Assigned(FWatchdog) then
    begin
      FWatchdog.SignalStop;
      FWatchdog.WaitFor;  // Esperar a que termine limpiamente
      FreeAndNil(FWatchdog);
    end;
    
    Application.Terminate;
  end;
end;

procedure TfrmMain.itemSyncClick(Sender: TObject);
begin
  TrayIcon.BalloonHint := 'Sincronización forzada iniciada...';
  TrayIcon.ShowBalloonHint;
  // La sincronización ocurre automáticamente por el Watchdog, 
  // pero aquí se podría disparar un escaneo inmediato.
end;

end.
