import { generateInvoicePDF, generateInvoicePDFToFile } from './generators/pdf-generator';
import { generateXRechnungXMLFile } from './generators/xml/xrechnung-generator';
import { loadInvoiceData } from './utils/data-loader';

// PDF Generator
export { generateInvoicePDF, generateInvoicePDFToFile } from './generators/pdf-generator';
export { PDFGenerator } from './generators/pdf-generator';

// XRechnung Generator
export { generateXRechnungXML, generateXRechnungXMLFile } from './generators/xml/xrechnung-generator';
export { XRechnungGenerator } from './generators/xml/xrechnung-generator';

// ZUGFeRD Generator
export { ZUGFeRDGenerator } from './generators/zugferd/zugferd-generator';
export { ZUGFeRDPDFA3Generator, ZUGFeRDOptions } from './generators/zugferd/zugferd-pdfa3-generator';

// Data loading
export { loadInvoiceData } from './utils/data-loader';
export { loadTestInvoice, loadTestInvoiceData } from './utils/test-data';

// Validation
export { validateInvoice, validateEmail, validateIBAN, validateBIC, loadAndValidateInvoice } from './utils/validator';
export type { ValidationError, ValidationResult } from './utils/validator';

// Convenience function
export async function generateFromJSON(jsonPath: string, pdfOutputPath: string, xmlOutputPath?: string, options?: any): Promise<void> {
  const invoice = loadInvoiceData(jsonPath);
  
  // Generate PDF
  await generateInvoicePDFToFile(invoice, pdfOutputPath, options);
  
  // Generate XML if path is provided
  if (xmlOutputPath) {
    await generateXRechnungXMLFile(invoice, xmlOutputPath);
  }
}

// Types
export * from './types/invoice.types'; 