import * as interfaces from './interfaces/index.js';

// Define English translations without enforcing TTranslationImplementation yet
export const EN_translations = {
  address: 'Address',
  bankConnection: 'Bank Connection',
  contactInfo: 'Contact Info',
  description: 'Description',
  invoice: 'Invoice',
  itemPos: 'Item Pos.',
  quantity: 'Quantity',
  registrationInfo: 'Registration Info',
  reverseVatNote: 'VAT arises on a reverse charge basis and is payable by the customer.',
  totalNetPrice: 'Total Net Price',
  unitNetPrice: 'Unit Net Price',
  unitType: 'Unit Type',
  yourCustomerId: 'Your Customer ID:',
  yourVatId: 'Your vat id on file:',
  continuesOnPage: 'Continues on page',
  finalPageStatement: 'This is the final page of this document.',
  page: 'Page',
  vatShort: 'VAT',
} as const;

// Infer keys of EN_translations
export type TTranslationKey = keyof typeof EN_translations;

// Define the type for all translations based on EN_translations keys
export type TTranslationImplementation = {
  [key in TTranslationKey]: string;
};

// Define German translations
export const DE_translations: TTranslationImplementation = {
  address: 'Adresse',
  bankConnection: 'Bankverbindung',
  contactInfo: 'Kontaktinformationen',
  description: 'Beschreibung',
  invoice: 'Rechnung',
  itemPos: 'Pos.',
  quantity: 'Anzahl',
  registrationInfo: 'HRA/HRB Info',
  reverseVatNote:
    'Umkehr der Umsatzsteuerpflicht: Der Rechnungsempfänger ist für die korrekte Abrechnung der Umsatzsteuer zuständig.',
  totalNetPrice: 'Summe netto',
  unitNetPrice: 'Einheit netto',
  unitType: 'Einheit',
  yourCustomerId: 'Ihre Kundennummer:',
  yourVatId: 'Ihre Umsatzsteuer-ID:',
  continuesOnPage: 'Fortsetzung auf Seite',
  finalPageStatement: 'Dies ist die letzte Seite dieses Dokuments.',
  page: 'Seite',
  vatShort: 'USt',
};

// Define Spanish translations
export const ES_translations: TTranslationImplementation = {
  address: 'Dirección',
  bankConnection: 'Conexión bancaria',
  contactInfo: 'Información de contacto',
  description: 'Descripción',
  invoice: 'Factura',
  itemPos: 'Pos.',
  quantity: 'Cantidad',
  registrationInfo: 'Información de registro',
  reverseVatNote: 'El IVA se aplica por inversión del sujeto pasivo y debe ser pagado por el cliente.',
  totalNetPrice: 'Precio total neto',
  unitNetPrice: 'Precio unitario neto',
  unitType: 'Tipo de unidad',
  yourCustomerId: 'Su número de cliente:',
  yourVatId: 'Su ID de IVA:',
  continuesOnPage: 'Continúa en la página',
  finalPageStatement: 'Esta es la última página de este documento.',
  page: 'Página',
  vatShort: 'IVA',
};

// Define French translations
export const FR_translations: TTranslationImplementation = {
  address: 'Adresse',
  bankConnection: 'Coordonnées bancaires',
  contactInfo: 'Informations de contact',
  description: 'Description',
  invoice: 'Facture',
  itemPos: 'Position',
  quantity: 'Quantité',
  registrationInfo: "Informations d'enregistrement",
  reverseVatNote:
    "La TVA s'applique selon le mécanisme d'autoliquidation et est à payer par le client.",
  totalNetPrice: 'Prix net total',
  unitNetPrice: 'Prix unitaire net',
  unitType: "Type d'unité",
  yourCustomerId: 'Votre numéro de client :',
  yourVatId: 'Votre numéro de TVA :',
  continuesOnPage: 'Continue sur la page',
  finalPageStatement: 'Ceci est la dernière page de ce document.',
  page: 'Page',
  vatShort: 'TVA',
};

// Define Italian translations
export const IT_translations: TTranslationImplementation = {
  address: 'Indirizzo',
  bankConnection: 'Coordinate bancarie',
  contactInfo: 'Informazioni di contatto',
  description: 'Descrizione',
  invoice: 'Fattura',
  itemPos: 'Pos.',
  quantity: 'Quantità',
  registrationInfo: 'Informazioni di registrazione',
  reverseVatNote: "L'IVA è applicata con inversione contabile ed è a carico del cliente.",
  totalNetPrice: 'Prezzo netto totale',
  unitNetPrice: 'Prezzo netto unitario',
  unitType: 'Tipo di unità',
  yourCustomerId: 'Il tuo numero cliente:',
  yourVatId: 'Il tuo numero di partita IVA:',
  continuesOnPage: 'Continua alla pagina',
  finalPageStatement: 'Questa è l\'ultima pagina di questo documento.',
  page: 'Pagina',
  vatShort: 'IVA',
};

// Language Code Map
export const languageCodeMap: Record<string, TTranslationImplementation> = {
  EN: EN_translations,
  DE: DE_translations,
  ES: ES_translations,
  FR: FR_translations,
  IT: IT_translations,
};

// Language Code Type
export type TLanguageCode = keyof typeof languageCodeMap;

// Translate Function
export const translate = (
  languageCode: TLanguageCode,
  key: TTranslationKey,
  defaultValue: string
): string => {
  const translations = languageCodeMap[languageCode] || EN_translations;
  return translations[key] || defaultValue;
};