import { business, finance } from '../plugins.js';

/**
 * Supported electronic invoice formats
 */
export enum InvoiceFormat {
  UNKNOWN = 'unknown',
  UBL = 'ubl', // Universal Business Language
  CII = 'cii', // Cross-Industry Invoice
  ZUGFERD = 'zugferd', // ZUGFeRD (German e-invoice format)
  FACTURX = 'facturx', // Factur-X (French e-invoice format)
  XRECHNUNG = 'xrechnung', // XRechnung (German e-invoice implementation of EN16931)
  FATTURAPA = 'fatturapa' // FatturaPA (Italian e-invoice format)
}

/**
 * Formats supported for export operations
 * This is a subset of InvoiceFormat that only includes formats
 * that can be generated and embedded in PDFs
 */
export type ExportFormat = 'facturx' | 'zugferd' | 'xrechnung' | 'ubl';

/**
 * Describes a validation level for invoice validation
 */
export enum ValidationLevel {
  SYNTAX = 'syntax', // Schema validation only
  SEMANTIC = 'semantic', // Semantic validation (field types, required fields, etc.)
  BUSINESS = 'business' // Business rule validation
}

/**
 * Describes a validation error
 */
export interface ValidationError {
  code: string; // Error code (e.g. "BR-16")
  message: string; // Error message
  location?: string; // XPath or location in the document
}

/**
 * Result of a validation operation
 */
export interface ValidationResult {
  valid: boolean; // Overall validation result
  errors: ValidationError[]; // List of validation errors
  level: ValidationLevel; // The level that was validated
}

/**
 * Options for the XInvoice class
 */
export interface XInvoiceOptions {
  validateOnLoad?: boolean; // Whether to validate when loading an invoice
  validationLevel?: ValidationLevel; // Level of validation to perform
}

/**
 * Interface for validator implementations
 */
export interface IValidator {
  validate(level?: ValidationLevel): ValidationResult;
  isValid(): boolean;
  getValidationErrors(): ValidationError[];
}

/**
 * PDF interface
 */
export interface IPdf {
  name: string;
  id: string;
  metadata: {
    textExtraction: string;
    format?: string;
    embeddedXml?: {
      filename: string;
      description: string;
    };
  };
  buffer: Uint8Array;
}

// Re-export types from tsclass for convenience
export type { TInvoice } from '@tsclass/tsclass/dist_ts/finance/index.js';
export type { TCreditNote } from '@tsclass/tsclass/dist_ts/finance/index.js';
export type { TDebitNote } from '@tsclass/tsclass/dist_ts/finance/index.js';
export type { TContact } from '@tsclass/tsclass/dist_ts/business/index.js';
export type { TLetterEnvelope } from '@tsclass/tsclass/dist_ts/business/index.js';
export type { TDocumentEnvelope } from '@tsclass/tsclass/dist_ts/business/index.js';