import { BaseEncoder } from '../base/base.encoder.js';
import { InvoiceFormat } from '../../interfaces/common.js';
import type { ExportFormat } from '../../interfaces/common.js';

// Import specific encoders
import { XRechnungEncoder } from '../ubl/xrechnung/xrechnung.encoder.js';
import { FacturXEncoder } from '../cii/facturx/facturx.encoder.js';
import { ZUGFeRDEncoder } from '../cii/zugferd/zugferd.encoder.js';

/**
 * Factory to create the appropriate encoder based on the target format
 */
export class EncoderFactory {
  /**
   * Creates an encoder for the specified format
   * @param format Target format for encoding
   * @returns Appropriate encoder instance
   */
  public static createEncoder(format: ExportFormat | InvoiceFormat): BaseEncoder {
    switch (format.toLowerCase()) {
      case InvoiceFormat.UBL:
      case 'ubl':
        // return new UBLEncoder();
        throw new Error('UBL encoder not yet implemented');

      case InvoiceFormat.XRECHNUNG:
      case 'xrechnung':
        return new XRechnungEncoder();

      case InvoiceFormat.CII:
        // For now, use Factur-X encoder for generic CII
        return new FacturXEncoder();

      case InvoiceFormat.ZUGFERD:
      case 'zugferd':
        // Use dedicated ZUGFeRD encoder
        return new ZUGFeRDEncoder();

      case InvoiceFormat.FACTURX:
      case 'facturx':
        return new FacturXEncoder();

      default:
        throw new Error(`Unsupported invoice format for encoding: ${format}`);
    }
  }
}