unit frm_AsignarArticulosWeb;

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, uAppTheme, uEnviosWebImporter;

type
  TfrmAsignarArticulosWeb = class(TForm)
    pnlHeader: TPanel;
    lblTitle: TLabel;
    lblSubtitle: TLabel;
    pnlMain: TPanel;
    lvProducts: TListView;
    pnlButtons: TPanel;
    btnAsignar: TButton;
    btnOmitir: TButton;
    btnCerrar: TButton;
    lblStatus: TLabel;

    procedure FormShow(Sender: TObject);
    procedure btnAsignarClick(Sender: TObject);
    procedure btnOmitirClick(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
    procedure lvProductsDblClick(Sender: TObject);
  private
    FProducts: TArray<TWebProduct>;
    FEmpresaId: Integer;
    FAllAssigned: Boolean;
    procedure AsignarProductoSeleccionado;
  public
    property EmpresaId: Integer read FEmpresaId write FEmpresaId;
    property AllAssigned: Boolean read FAllAssigned;

    /// Carga los productos no vinculados. Devuelve True si hay productos pendientes.
    function LoadUnmatched: Boolean;
  end;

var
  frmAsignarArticulosWeb: TfrmAsignarArticulosWeb;

implementation

uses
  dmg_Main, frm_SelectProduct;

{$R *.dfm}

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.FormShow(Sender: TObject);
begin
  TAppTheme.ApplyToForm(Self);
  lblStatus.Caption := '';
  FAllAssigned := False;
end;

// ---------------------------------------------------------------------------
function TfrmAsignarArticulosWeb.LoadUnmatched: Boolean;
var
  LMsg: string;
  i: Integer;
  LItem: TListItem;
begin
  Result := False;
  lvProducts.Items.Clear;

  Screen.Cursor := crHourGlass;
  try
    if TWebOrderImporter.FetchUnmatchedProducts(FEmpresaId, FProducts, LMsg) then
    begin
      if Length(FProducts) = 0 then
      begin
        FAllAssigned := True;
        lblStatus.Caption := '✅ Todos los productos web están vinculados correctamente.';
        lblStatus.Font.Color := clGreen;
        Exit; // No hay pendientes
      end;

      lvProducts.Items.BeginUpdate;
      try
        for i := 0 to Length(FProducts) - 1 do
        begin
          LItem := lvProducts.Items.Add;
          LItem.Caption := IntToStr(FProducts[i].ProductId);
          LItem.SubItems.Add(FProducts[i].ProductName);
          LItem.SubItems.Add('Sin asignar');
          LItem.Data := Pointer(i); // Índice en FProducts
        end;
      finally
        lvProducts.Items.EndUpdate;
      end;

      lblStatus.Caption := Format('⚠ %d producto(s) web sin vincular a artículos locales.', [Length(FProducts)]);
      lblStatus.Font.Color := clMaroon;
      Result := True; // Hay pendientes
    end
    else
    begin
      lblStatus.Caption := '❌ Error: ' + LMsg;
      lblStatus.Font.Color := clRed;
    end;
  finally
    Screen.Cursor := crDefault;
  end;
end;

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.AsignarProductoSeleccionado;
var
  LIdx: Integer;
  LProdId: Int64;
  LProdName: string;
begin
  if lvProducts.Selected = nil then
  begin
    ShowMessage('Seleccione un producto web de la lista.');
    Exit;
  end;

  if lvProducts.Selected.SubItems[1] <> 'Sin asignar' then
  begin
    ShowMessage('Este producto ya ha sido asignado.');
    Exit;
  end;

  LIdx := Integer(lvProducts.Selected.Data);
  LProdId := FProducts[LIdx].ProductId;
  LProdName := FProducts[LIdx].ProductName;

  // Abrir el selector de productos locales
  if not Assigned(frmSelectProduct) then
    Application.CreateForm(TfrmSelectProduct, frmSelectProduct);

  frmSelectProduct.Caption := 'Seleccione artículo local para: ' + LProdName;

  if frmSelectProduct.ShowModal = mrOk then
  begin
    if frmSelectProduct.SelectedId <> '' then
    begin
      try
        TWebOrderImporter.AssignWebProduct(LProdId, frmSelectProduct.SelectedId);
        FProducts[LIdx].LocalArticuloId := frmSelectProduct.SelectedId;
        lvProducts.Selected.SubItems[1] := '✅ ' + frmSelectProduct.SelectedDesc;
      except
        on E: Exception do
          ShowMessage('Error al asignar: ' + E.Message);
      end;
    end;
  end;

  // Comprobar si quedan productos sin asignar
  var LPendientes := 0;
  for var j := 0 to Length(FProducts) - 1 do
    if FProducts[j].LocalArticuloId = '' then
      Inc(LPendientes);

  if LPendientes = 0 then
  begin
    FAllAssigned := True;
    lblStatus.Caption := '✅ Todos los productos han sido vinculados.';
    lblStatus.Font.Color := clGreen;
  end
  else
    lblStatus.Caption := Format('⚠ Quedan %d producto(s) sin vincular.', [LPendientes]);
end;

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.btnAsignarClick(Sender: TObject);
begin
  AsignarProductoSeleccionado;
end;

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.lvProductsDblClick(Sender: TObject);
begin
  AsignarProductoSeleccionado;
end;

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.btnOmitirClick(Sender: TObject);
begin
  ModalResult := mrOk;
  Close;
end;

// ---------------------------------------------------------------------------
procedure TfrmAsignarArticulosWeb.btnCerrarClick(Sender: TObject);
begin
  ModalResult := mrCancel;
  Close;
end;

end.
