program TestRenderLabel;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Classes,
  Data.DB,
  FireDAC.Comp.Client,
  frxClass,
  frxDBSet,
  frxBarcode,
  frxExportPDF,
  frxExportImage;

procedure RunTest;
var
  MemData: TFDMemTable;
  FrxDB: TfrxDBDataset;
  Report: TfrxReport;
  PdfExport: TfrxPDFExport;
  ImgExport: TfrxJPEGExport;
  LReportPath, LPdfOut, LImgOut: string;
begin
  LReportPath := 'reportes\EtiquetaTipsa.fr3';
  LPdfOut := 'scratch\EtiquetaBultoECI_sample.pdf';
  LImgOut := 'scratch\EtiquetaBultoECI_sample.jpg';

  Writeln('Testing FastReport template: ' + LReportPath);

  MemData := TFDMemTable.Create(nil);
  FrxDB := TfrxDBDataset.Create(nil);
  Report := TfrxReport.Create(nil);
  PdfExport := TfrxPDFExport.Create(nil);
  ImgExport := TfrxJPEGExport.Create(nil);
  try
    MemData.FieldDefs.Add('proveedor_nombre', ftString, 100);
    MemData.FieldDefs.Add('proveedor_operador', ftString, 100);
    MemData.FieldDefs.Add('proveedor_dir', ftString, 150);
    MemData.FieldDefs.Add('lugar_entrega_linea1', ftString, 100);
    MemData.FieldDefs.Add('lugar_entrega_linea2', ftString, 100);
    MemData.FieldDefs.Add('lugar_entrega_linea3', ftString, 150);
    MemData.FieldDefs.Add('destino_linea1', ftString, 100);
    MemData.FieldDefs.Add('destino_linea2', ftString, 100);
    MemData.FieldDefs.Add('destino_linea3', ftString, 150);
    MemData.FieldDefs.Add('sucursal_codigo', ftString, 10);
    MemData.FieldDefs.Add('barcode_ia91', ftString, 30);
    MemData.FieldDefs.Add('dpto_pventa', ftString, 20);
    MemData.FieldDefs.Add('pedido_num', ftString, 20);
    MemData.FieldDefs.Add('albaran_num', ftString, 20);
    MemData.FieldDefs.Add('barcode_ia98', ftString, 50);
    MemData.FieldDefs.Add('bulto_texto', ftString, 30);
    MemData.FieldDefs.Add('bulto_num', ftInteger);
    MemData.FieldDefs.Add('total_bultos', ftInteger);
    MemData.FieldDefs.Add('sscc', ftString, 30);
    MemData.FieldDefs.Add('barcode_ia00', ftString, 50);
    MemData.CreateDataSet;

    // Record 1: Sample matching the ECI manual / email example
    MemData.Append;
    MemData.FieldByName('proveedor_nombre').AsString := 'RAÚL ASENCIO PASTELERIAS S.L.';
    MemData.FieldByName('proveedor_operador').AsString := '';
    MemData.FieldByName('proveedor_dir').AsString := 'Avda. Alcalde Carlos Carbonell, 130 - 03680 Aspe (Alicante)';
    MemData.FieldByName('lugar_entrega_linea1').AsString := 'EL CORTE INGLÉS, S.A.';
    MemData.FieldByName('lugar_entrega_linea2').AsString := 'ALMACÉN DE VALDEMORO';
    MemData.FieldByName('lugar_entrega_linea3').AsString := 'Carretera de Andalucía, Km. 22.300. (MADRID)';
    MemData.FieldByName('destino_linea1').AsString := 'EL CORTE INGLÉS, S.A.';
    MemData.FieldByName('destino_linea2').AsString := 'C.C. GOYA';
    MemData.FieldByName('destino_linea3').AsString := 'C/ Goya, 75 (MADRID)';
    MemData.FieldByName('sucursal_codigo').AsString := '0003';
    MemData.FieldByName('barcode_ia91').AsString := '(91)010003';
    MemData.FieldByName('dpto_pventa').AsString := '030 - 00';
    MemData.FieldByName('pedido_num').AsString := '91026401';
    MemData.FieldByName('albaran_num').AsString := '2640102';
    MemData.FieldByName('barcode_ia98').AsString := '(98)03000910264012640102';
    MemData.FieldByName('bulto_texto').AsString := '54 / 58';
    MemData.FieldByName('bulto_num').AsInteger := 54;
    MemData.FieldByName('total_bultos').AsInteger := 58;
    MemData.FieldByName('sscc').AsString := '384123450000000073';
    MemData.FieldByName('barcode_ia00').AsString := '(00)384123450000000073';
    MemData.Post;

    FrxDB.DataSet := MemData;
    FrxDB.UserName := 'frxDBmaster';
    FrxDB.Name := 'frxDBmaster';

    Report.EngineOptions.SilentMode := True;
    Report.EngineOptions.EnableThreadSafe := True;
    Report.Clear;
    Report.LoadFromFile(LReportPath);
    Report.DataSets.Clear;
    Report.DataSets.Add(FrxDB);
    Report.EnabledDataSets.Clear;
    Report.EnabledDataSets.Add(FrxDB);

    var LComp := Report.FindObject('MasterData1');
    if (LComp <> nil) and (LComp is TfrxMasterData) then
      TfrxMasterData(LComp).DataSet := FrxDB;

    Report.PrepareReport(True);
    Writeln('Report prepared successfully. Pages: ' + IntToStr(Report.PreviewPages.Count));

    PdfExport.ShowDialog := False;
    PdfExport.ShowProgress := False;
    PdfExport.OpenAfterExport := False;
    PdfExport.FileName := LPdfOut;
    Report.Export(PdfExport);
    Writeln('Exported PDF: ' + LPdfOut);

    ImgExport.ShowDialog := False;
    ImgExport.ShowProgress := False;
    ImgExport.FileName := LImgOut;
    Report.Export(ImgExport);
    Writeln('Exported JPEG: ' + LImgOut);

  finally
    MemData.Free;
    FrxDB.Free;
    Report.Free;
    PdfExport.Free;
    ImgExport.Free;
  end;
end;

begin
  try
    RunTest;
    Writeln('ALL TESTS COMPLETED SUCCESSFULLY.');
  except
    on E: Exception do
      Writeln('ERROR: ' + E.ClassName + ': ' + E.Message);
  end;
end.
