unit frm_ImportarPedidosWeb;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.ExtCtrls, Vcl.Buttons, uAppTheme, uEnviosWebImporter;
type
  TfrmImportarPedidosWeb = class(TForm)
    pnlHeader: TPanel;
    lblTitle: TLabel;
    lblSubtitle: TLabel;
    pnlMain: TPanel;
    lvOrders: TListView;
    pnlButtons: TPanel;
    btnCargar: TButton;
    btnImportar: TButton;
    btnCerrar: TButton;
    lblStatus: TLabel;
    
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnCargarClick(Sender: TObject);
    procedure btnImportarClick(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
    procedure lvOrdersSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
  private
    FOrders: TArray<TWebOrderHeader>;
    FDesactivarCheckPorDefecto: Boolean;
    FFechaInicialConsultada: TDateTime;
    FImportedAny: Boolean;
    procedure CargarPedidosWeb;
    procedure FormCloseHandler(Sender: TObject; var Action: TCloseAction);
  public
    property DesactivarCheckPorDefecto: Boolean read FDesactivarCheckPorDefecto write FDesactivarCheckPorDefecto;
    property FechaInicialConsultada: TDateTime read FFechaInicialConsultada write FFechaInicialConsultada;
  end;

var
  frmImportarPedidosWeb: TfrmImportarPedidosWeb;

implementation

uses
  dmg_Main;

{$R *.dfm}

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.FormCreate(Sender: TObject);
begin
  SetLength(FOrders, 0);
  FImportedAny := False;
  Self.OnClose := FormCloseHandler;
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.FormShow(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);
  lblStatus.Caption := '';
  btnImportar.Enabled := False;
  CargarPedidosWeb;
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.btnCargarClick(Sender: TObject);
begin
  CargarPedidosWeb;
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.CargarPedidosWeb;
var
  LMsg: string;
  i: Integer;
  LItem: TListItem;
  LFechaStr: string;
  LFechaDesde: TDateTime;
begin
  if FFechaInicialConsultada > 0 then
    LFechaDesde := FFechaInicialConsultada
  else
  begin
    LFechaStr := FormatDateTime('dd/MM/yyyy', Date - 30);
    if not InputQuery('Importación de Pedidos WooCommerce', 
                      'Indique la fecha desde la cual desea consultar pedidos web:', 
                      LFechaStr) then
    begin
      lblStatus.Caption := 'Carga cancelada por el usuario.';
      Exit;
    end;

    if not TryStrToDate(LFechaStr, LFechaDesde) then
      LFechaDesde := Date - 30;
  end;

  lblStatus.Caption := '⏳ Leyendo pedidos web desde el ' + FormatDateTime('dd/MM/yyyy', LFechaDesde) + '...';
  lblStatus.Font.Color := clGray;
  lvOrders.Items.Clear;
  btnImportar.Enabled := False;
  Application.ProcessMessages;
  
  if TWebOrderImporter.FetchPendingOrders(LFechaDesde, FOrders, LMsg) then
  begin
    lvOrders.Items.BeginUpdate;
    try
      for i := 0 to Length(FOrders) - 1 do
      begin
        LItem := lvOrders.Items.Add;
        LItem.Caption := IntToStr(FOrders[i].OrderId);
        LItem.SubItems.Add(FormatDateTime('dd/MM/yyyy hh:nn', FOrders[i].DateCreated));
        var LNomClient := FOrders[i].NomCliente;
        if FOrders[i].Nif <> '' then
          LNomClient := LNomClient + ' [' + FOrders[i].Nif + ']';
        LItem.SubItems.Add(LNomClient);
        LItem.SubItems.Add(FOrders[i].Poblacion);
        LItem.SubItems.Add(FormatFloat('#,##0.00 €', FOrders[i].Total));
        LItem.SubItems.Add(FOrders[i].MetodoPago);
        
        if FOrders[i].Importado then
        begin
          LItem.SubItems.Add('Importado (' + FOrders[i].NumPedidoLocal + ')');
          LItem.Checked := False;
        end
        else
        begin
          if SameText(FOrders[i].WcStatus, 'wc-completed') then
            LItem.SubItems.Add('Completado (Web)')
          else if SameText(FOrders[i].WcStatus, 'wc-processing') then
            LItem.SubItems.Add('Procesando (Web)')
          else
            LItem.SubItems.Add('Pendiente (' + FOrders[i].WcStatus + ')');
          
          LItem.Checked := not FDesactivarCheckPorDefecto;
        end;
      end;
    finally
      lvOrders.Items.EndUpdate;
    end;
    
    lblStatus.Caption := Format('✅ Carga finalizada. %d pedidos listados (incluyendo histórico).', [lvOrders.Items.Count]);
    lblStatus.Font.Color := clGreen;
    btnImportar.Enabled := lvOrders.Items.Count > 0;
  end;
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.btnImportarClick(Sender: TObject);
var
  i, LImportadosCount: Integer;
  LOrderId: Int64;
  LDetails: TWebOrder;
  LNewId: Int64;
  LMsg: string;
  LCheckedAny: Boolean;
begin
  LCheckedAny := False;
  for i := 0 to lvOrders.Items.Count - 1 do
    if lvOrders.Items[i].Checked and (Pos('Importado', lvOrders.Items[i].SubItems[5]) = 0) then
    begin
      LCheckedAny := True;
      Break;
    end;
    
  if not LCheckedAny then
  begin
    ShowMessage('Seleccione al menos un pedido pendiente de importar.');
    Exit;
  end;
  
  if MessageDlg('Se van a importar los pedidos seleccionados a la base de datos local. ¿Confirma?',
    mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit;
    
  LImportadosCount := 0;
  btnImportar.Enabled := False;
  btnCargar.Enabled := False;
  
  for i := 0 to lvOrders.Items.Count - 1 do
  begin
    if lvOrders.Items[i].Checked and (Pos('Importado', lvOrders.Items[i].SubItems[5]) = 0) then
    begin
      LOrderId := StrToInt64Def(lvOrders.Items[i].Caption, 0);
      lblStatus.Caption := '⏳ Importando pedido web ' + IntToStr(LOrderId) + '...';
      lblStatus.Font.Color := clGray;
      Application.ProcessMessages;
      
      if TWebOrderImporter.FetchOrderDetails(StrToIntDef(dmgMain.CurrentCompanyId, 1), LOrderId, LDetails, LMsg) then
      begin
        LNewId := TWebOrderImporter.ImportOrder(LDetails, StrToIntDef(dmgMain.CurrentCompanyId, 1), LMsg);
        if LNewId > 0 then
        begin
          lvOrders.Items[i].SubItems[5] := 'Importado (ID local: ' + IntToStr(LNewId) + ')';
          lvOrders.Items[i].Checked := False;
          Inc(LImportadosCount);
        end
        else
        begin
          lvOrders.Items[i].SubItems[5] := 'Error: ' + LMsg;
        end;
      end
      else
      begin
        lvOrders.Items[i].SubItems[5] := 'Error de detalles: ' + LMsg;
      end;
    end;
  end;
  
  btnCargar.Enabled := True;
  btnImportar.Enabled := True;
  
  lblStatus.Caption := Format('✅ Proceso finalizado. %d pedidos importados con éxito.', [LImportadosCount]);
  lblStatus.Font.Color := clGreen;
  
  if LImportadosCount > 0 then
    FImportedAny := True;
    
  MessageDlg(Format('Se han importado %d pedido(s) correctamente.', [LImportadosCount]), mtInformation, [mbOK], 0);
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.btnCerrarClick(Sender: TObject);
begin
  if FImportedAny then
    ModalResult := mrOk
  else
    ModalResult := mrCancel;
  Close;
end;

procedure TfrmImportarPedidosWeb.FormCloseHandler(Sender: TObject; var Action: TCloseAction);
begin
  if FImportedAny then
    ModalResult := mrOk
  else
    ModalResult := mrCancel;
end;

// ---------------------------------------------------------------------------
procedure TfrmImportarPedidosWeb.lvOrdersSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
begin
  // No-op
end;

end.
