import { PDFEmbedder, PDFExtractor, TInvoice, FacturXEncoder } from '../ts/index.js';
import * as fs from 'fs/promises';

/**
 * Example demonstrating how to use the PDF handling classes
 */
async function pdfHandlingExample() {
  try {
    // Create a sample invoice
    const invoice: TInvoice = createSampleInvoice();
    
    // Create a Factur-X encoder
    const encoder = new FacturXEncoder();
    
    // Generate XML
    const xmlContent = await encoder.encode(invoice);
    console.log('Generated XML:');
    console.log(xmlContent.substring(0, 500) + '...');
    
    // Load a sample PDF
    const pdfBuffer = await fs.readFile('examples/sample.pdf');
    console.log(`Loaded PDF (${pdfBuffer.length} bytes)`);
    
    // Create a PDF embedder
    const embedder = new PDFEmbedder();
    
    // Embed XML into PDF
    const modifiedPdfBuffer = await embedder.embedXml(
      pdfBuffer,
      xmlContent,
      'factur-x.xml',
      'Factur-X XML Invoice'
    );
    console.log(`Created modified PDF (${modifiedPdfBuffer.length} bytes)`);
    
    // Save the modified PDF
    await fs.writeFile('examples/output.pdf', modifiedPdfBuffer);
    console.log('Saved modified PDF to examples/output.pdf');
    
    // Create a PDF extractor
    const extractor = new PDFExtractor();
    
    // Extract XML from the modified PDF
    const extractedXml = await extractor.extractXml(modifiedPdfBuffer);
    console.log('Extracted XML:');
    console.log(extractedXml ? extractedXml.substring(0, 500) + '...' : 'No XML found');
    
    // Save the extracted XML
    if (extractedXml) {
      await fs.writeFile('examples/extracted.xml', extractedXml);
      console.log('Saved extracted XML to examples/extracted.xml');
    }
    
    console.log('PDF handling example completed successfully');
  } catch (error) {
    console.error('Error in PDF handling example:', error);
  }
}

/**
 * Creates a sample invoice for testing
 * @returns Sample invoice
 */
function createSampleInvoice(): TInvoice {
  return {
    type: 'invoice',
    id: 'INV-2023-001',
    invoiceType: 'debitnote',
    date: Date.now(),
    status: 'invoice',
    versionInfo: {
      type: 'final',
      version: '1.0.0'
    },
    language: 'en',
    incidenceId: 'INV-2023-001',
    from: {
      type: 'company',
      name: 'Supplier Company',
      description: 'Supplier',
      address: {
        streetName: 'Supplier Street',
        houseNumber: '123',
        postalCode: '12345',
        city: 'Supplier City',
        country: 'DE',
        countryCode: 'DE'
      },
      status: 'active',
      foundedDate: {
        year: 2000,
        month: 1,
        day: 1
      },
      registrationDetails: {
        vatId: 'DE123456789',
        registrationId: 'HRB12345',
        registrationName: 'Supplier Company GmbH'
      }
    },
    to: {
      type: 'company',
      name: 'Customer Company',
      description: 'Customer',
      address: {
        streetName: 'Customer Street',
        houseNumber: '456',
        postalCode: '54321',
        city: 'Customer City',
        country: 'DE',
        countryCode: 'DE'
      },
      status: 'active',
      foundedDate: {
        year: 2005,
        month: 6,
        day: 15
      },
      registrationDetails: {
        vatId: 'DE987654321',
        registrationId: 'HRB54321',
        registrationName: 'Customer Company GmbH'
      }
    },
    subject: 'Invoice INV-2023-001',
    content: {
      invoiceData: {
        id: 'INV-2023-001',
        status: null,
        type: 'debitnote',
        billedBy: {
          type: 'company',
          name: 'Supplier Company',
          description: 'Supplier',
          address: {
            streetName: 'Supplier Street',
            houseNumber: '123',
            postalCode: '12345',
            city: 'Supplier City',
            country: 'DE',
            countryCode: 'DE'
          },
          status: 'active',
          foundedDate: {
            year: 2000,
            month: 1,
            day: 1
          },
          registrationDetails: {
            vatId: 'DE123456789',
            registrationId: 'HRB12345',
            registrationName: 'Supplier Company GmbH'
          }
        },
        billedTo: {
          type: 'company',
          name: 'Customer Company',
          description: 'Customer',
          address: {
            streetName: 'Customer Street',
            houseNumber: '456',
            postalCode: '54321',
            city: 'Customer City',
            country: 'DE',
            countryCode: 'DE'
          },
          status: 'active',
          foundedDate: {
            year: 2005,
            month: 6,
            day: 15
          },
          registrationDetails: {
            vatId: 'DE987654321',
            registrationId: 'HRB54321',
            registrationName: 'Customer Company GmbH'
          }
        },
        deliveryDate: Date.now(),
        dueInDays: 30,
        periodOfPerformance: null,
        printResult: null,
        currency: 'EUR',
        notes: ['Thank you for your business'],
        items: [
          {
            position: 1,
            name: 'Product A',
            articleNumber: 'PROD-A',
            unitType: 'EA',
            unitQuantity: 2,
            unitNetPrice: 100,
            vatPercentage: 19
          },
          {
            position: 2,
            name: 'Service B',
            articleNumber: 'SERV-B',
            unitType: 'HUR',
            unitQuantity: 5,
            unitNetPrice: 80,
            vatPercentage: 19
          }
        ],
        reverseCharge: false
      },
      textData: null,
      timesheetData: null,
      contractData: null
    }
  } as TInvoice;
}

// Run the example
pdfHandlingExample();