import type { Locale } from '../i18n/types';
import { docStrings, formatDocDate } from './docStrings';
import type { AISystem, CompanyProfile, ContentPack, Obligation } from './types';

/** Kontaktzeilen aus dem Firmenprofil (leer, wenn kein Profil gepflegt). */
function companyRows(profile: CompanyProfile | undefined, locale: Locale): readonly string[] {
  const s = docStrings(locale);
  if (!profile || profile.name.trim() === '') return [];
  const contact = [profile.street, profile.zipCity, profile.email, profile.phone, profile.website]
    .filter((p) => p.trim() !== '')
    .join(' · ');
  return [
    `| **${s.meta.company}** | ${profile.name} |`,
    ...(contact ? [`| **${s.meta.contact}** | ${contact} |`] : []),
    ...(profile.contactPerson.trim()
      ? [`| **${s.meta.contactPerson}** | ${profile.contactPerson} |`]
      : []),
  ];
}

function header(
  title: string,
  system: AISystem,
  pack: ContentPack,
  today: string,
  locale: Locale,
  profile?: CompanyProfile,
): string {
  const s = docStrings(locale);
  return [
    `# ${title}`,
    '',
    `| | |`,
    `|---|---|`,
    ...companyRows(profile, locale),
    `| **${s.meta.system}** | ${system.name} |`,
    `| **${s.meta.purpose}** | ${system.purpose || '—'} |`,
    `| **${s.meta.vendor}** | ${system.vendor || '—'} |`,
    `| **${s.meta.owner}** | ${system.owner || '—'} |`,
    `| **${s.meta.role}** | ${s.role[system.answers.role]} |`,
    `| **${s.meta.riskClass}** | ${s.risk[system.classification.riskClass]} |`,
    `| **${s.meta.createdAt}** | ${formatDocDate(today, locale)} |`,
    `| **${s.meta.contentPack}** | v${pack.version} (${pack.legalBasis}) |`,
    '',
    s.disclaimer,
    '',
  ].join('\n');
}

/**
 * Erzeugt den Risikoklassifizierungs-Bericht für ein System als Markdown.
 *
 * @param system - Bewertetes KI-System
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil für den Berichtskopf (optional)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function riskReport(
  system: AISystem,
  pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const lines = [header(s.report.title, system, pack, today, locale, profile)];

  lines.push(`## ${s.report.result}`, '');
  lines.push(`**${s.risk[system.classification.riskClass]}**`, '');

  lines.push(`## ${s.report.reasons}`, '');
  for (const reason of system.classification.reasons) {
    lines.push(`- ${reason}`);
  }
  lines.push('');

  if (system.classification.gpaiObligations) {
    lines.push(`## ${s.report.gpai}`, '', s.report.gpaiText, '');
  }
  if (system.classification.art64DocumentationDuty) {
    lines.push(`## ${s.report.art64}`, '', s.report.art64Text, '');
  }

  return lines.join('\n');
}

/**
 * Erzeugt den Maßnahmenplan (Pflichten-Checkliste) als Markdown.
 *
 * @param system - Bewertetes KI-System
 * @param obligations - Anwendbare Pflichten
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil für den Berichtskopf (optional)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function actionPlan(
  system: AISystem,
  obligations: readonly Obligation[],
  pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const lines = [header(s.plan.title, system, pack, today, locale, profile)];

  if (obligations.length === 0) {
    lines.push(s.plan.none);
    return lines.join('\n');
  }

  lines.push(`## ${s.plan.obligations}`, '');
  lines.push(`| ${s.plan.colObligation} | ${s.plan.colLegal} | ${s.plan.colDeadline} | ${s.plan.colStatus} |`);
  lines.push('|---|---|---|---|');
  for (const ob of obligations) {
    const status = system.obligationStatus[ob.id] ?? 'open';
    lines.push(
      `| ${ob.title} | ${ob.articles} | ${formatDocDate(ob.deadline, locale)} | ${s.status[status]} |`,
    );
  }
  lines.push('', `## ${s.plan.details}`, '');
  for (const ob of obligations) {
    lines.push(`### ${ob.title} (${ob.articles})`, '', ob.description, '');
  }

  return lines.join('\n');
}

const ANNEX_IV_SECTIONS: Readonly<Record<Locale, readonly (readonly [string, readonly string[]])[]>> = {
  de: [
    ['1. Allgemeine Beschreibung des KI-Systems', [
      'Zweckbestimmung', 'Anbieter', 'Versionen und Datum des Inverkehrbringens',
      'Hardware-Anforderungen / Bereitstellungsform', 'Interaktion mit externer Hard-/Software',
    ]],
    ['2. Detaillierte Beschreibung der Elemente und des Entwicklungsprozesses', [
      'Entwicklungsmethoden und verwendete Werkzeuge', 'Systemarchitektur und Rechenressourcen',
      'Datenanforderungen (Trainings-, Validierungs-, Testdaten, Herkunft, Aufbereitung)',
      'Maßnahmen der menschlichen Aufsicht (Art. 14)',
      'Vorab festgelegte Änderungen und Kontinuität der Konformität',
    ]],
    ['3. Überwachung, Funktionsweise und Kontrolle', [
      'Fähigkeiten und Leistungsgrenzen (Genauigkeitsmetriken)',
      'Vorhersehbare unbeabsichtigte Ergebnisse und Risikoquellen', 'Eingabedaten-Spezifikation',
    ]],
    ['4. Risikomanagementsystem (Art. 9)', ['Beschreibung des Risikomanagementprozesses']],
    ['5. Änderungen über den Lebenszyklus', ['Änderungshistorie und Update-Prozess']],
    ['6. Angewandte harmonisierte Normen und Spezifikationen', [
      'Liste der Normen (z. B. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. EU-Konformitätserklärung', ['Kopie der Konformitätserklärung (Art. 47)']],
    ['8. Bewertung nach dem Inverkehrbringen (Art. 72)', [
      'Plan zur Beobachtung nach dem Inverkehrbringen',
    ]],
  ],
  en: [
    ['1. General description of the AI system', [
      'Intended purpose', 'Provider', 'Versions and date of placing on the market',
      'Hardware requirements / form of provision', 'Interaction with external hardware/software',
    ]],
    ['2. Detailed description of elements and development process', [
      'Development methods and tools used', 'System architecture and computational resources',
      'Data requirements (training, validation, test data; provenance, preparation)',
      'Human oversight measures (Art. 14)',
      'Pre-determined changes and continuity of conformity',
    ]],
    ['3. Monitoring, functioning and control', [
      'Capabilities and performance limitations (accuracy metrics)',
      'Foreseeable unintended outcomes and sources of risk', 'Input data specification',
    ]],
    ['4. Risk management system (Art. 9)', ['Description of the risk management process']],
    ['5. Changes over the lifecycle', ['Change history and update process']],
    ['6. Applied harmonised standards and specifications', [
      'List of standards (e.g. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. EU declaration of conformity', ['Copy of the declaration of conformity (Art. 47)']],
    ['8. Post-market evaluation (Art. 72)', ['Post-market monitoring plan']],
  ],
  fr: [
    ['1. Description générale du système d’IA', [
      'Destination', 'Fournisseur', 'Versions et date de mise sur le marché',
      'Exigences matérielles / forme de mise à disposition', 'Interaction avec du matériel/des logiciels externes',
    ]],
    ['2. Description détaillée des éléments et du processus de développement', [
      'Méthodes de développement et outils utilisés', 'Architecture du système et ressources de calcul',
      'Exigences en matière de données (données d’entraînement, de validation et de test ; provenance, préparation)',
      'Mesures de contrôle humain (art. 14)',
      'Modifications prédéterminées et continuité de la conformité',
    ]],
    ['3. Surveillance, fonctionnement et contrôle', [
      'Capacités et limites de performance (métriques d’exactitude)',
      'Résultats non intentionnels prévisibles et sources de risque', 'Spécification des données d’entrée',
    ]],
    ['4. Système de gestion des risques (art. 9)', ['Description du processus de gestion des risques']],
    ['5. Modifications au cours du cycle de vie', ['Historique des modifications et processus de mise à jour']],
    ['6. Normes harmonisées et spécifications appliquées', [
      'Liste des normes (p. ex. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. Déclaration UE de conformité', ['Copie de la déclaration de conformité (art. 47)']],
    ['8. Évaluation après la mise sur le marché (art. 72)', [
      'Plan de surveillance après commercialisation',
    ]],
  ],
  it: [
    ['1. Descrizione generale del sistema di IA', [
      'Finalità prevista', 'Fornitore', 'Versioni e data di immissione sul mercato',
      'Requisiti hardware / forma di fornitura', 'Interazione con hardware/software esterni',
    ]],
    ['2. Descrizione dettagliata degli elementi e del processo di sviluppo', [
      'Metodi di sviluppo e strumenti utilizzati', 'Architettura del sistema e risorse computazionali',
      'Requisiti dei dati (dati di addestramento, convalida e prova; provenienza, preparazione)',
      'Misure di sorveglianza umana (art. 14)',
      'Modifiche predeterminate e continuità della conformità',
    ]],
    ['3. Monitoraggio, funzionamento e controllo', [
      'Capacità e limiti di prestazione (metriche di accuratezza)',
      'Risultati indesiderati prevedibili e fonti di rischio', 'Specifica dei dati di input',
    ]],
    ['4. Sistema di gestione dei rischi (art. 9)', ['Descrizione del processo di gestione dei rischi']],
    ['5. Modifiche nel corso del ciclo di vita', ['Cronologia delle modifiche e processo di aggiornamento']],
    ['6. Norme armonizzate e specifiche applicate', [
      'Elenco delle norme (ad es. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. Dichiarazione di conformità UE', ['Copia della dichiarazione di conformità (art. 47)']],
    ['8. Valutazione successiva all’immissione sul mercato (art. 72)', [
      'Piano di monitoraggio successivo all’immissione sul mercato',
    ]],
  ],
  es: [
    ['1. Descripción general del sistema de IA', [
      'Finalidad prevista', 'Proveedor', 'Versiones y fecha de introducción en el mercado',
      'Requisitos de hardware / forma de suministro', 'Interacción con hardware/software externos',
    ]],
    ['2. Descripción detallada de los elementos y del proceso de desarrollo', [
      'Métodos de desarrollo y herramientas utilizadas', 'Arquitectura del sistema y recursos computacionales',
      'Requisitos de datos (datos de entrenamiento, validación y prueba; procedencia, preparación)',
      'Medidas de supervisión humana (art. 14)',
      'Modificaciones predeterminadas y continuidad de la conformidad',
    ]],
    ['3. Seguimiento, funcionamiento y control', [
      'Capacidades y limitaciones de rendimiento (métricas de precisión)',
      'Resultados no deseados previsibles y fuentes de riesgo', 'Especificación de los datos de entrada',
    ]],
    ['4. Sistema de gestión de riesgos (art. 9)', ['Descripción del proceso de gestión de riesgos']],
    ['5. Modificaciones durante el ciclo de vida', ['Historial de cambios y proceso de actualización']],
    ['6. Normas armonizadas y especificaciones aplicadas', [
      'Lista de normas (p. ej., ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. Declaración UE de conformidad', ['Copia de la declaración de conformidad (art. 47)']],
    ['8. Evaluación posterior a la comercialización (art. 72)', [
      'Plan de vigilancia poscomercialización',
    ]],
  ],
  pl: [
    ['1. Ogólny opis systemu AI', [
      'Przeznaczenie', 'Dostawca', 'Wersje i data wprowadzenia do obrotu',
      'Wymagania sprzętowe / forma udostępnienia', 'Interakcja z zewnętrznym sprzętem/oprogramowaniem',
    ]],
    ['2. Szczegółowy opis elementów i procesu rozwoju', [
      'Metody rozwoju i użyte narzędzia', 'Architektura systemu i zasoby obliczeniowe',
      'Wymagania dotyczące danych (dane treningowe, walidacyjne, testowe; pochodzenie, przygotowanie)',
      'Środki nadzoru ludzkiego (art. 14)',
      'Z góry określone zmiany i ciągłość zgodności',
    ]],
    ['3. Monitorowanie, funkcjonowanie i kontrola', [
      'Zdolności i ograniczenia skuteczności (metryki dokładności)',
      'Przewidywalne niezamierzone wyniki i źródła ryzyka', 'Specyfikacja danych wejściowych',
    ]],
    ['4. System zarządzania ryzykiem (art. 9)', ['Opis procesu zarządzania ryzykiem']],
    ['5. Zmiany w cyklu życia', ['Historia zmian i proces aktualizacji']],
    ['6. Zastosowane normy zharmonizowane i specyfikacje', [
      'Lista norm (np. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. Deklaracja zgodności UE', ['Kopia deklaracji zgodności (art. 47)']],
    ['8. Ocena po wprowadzeniu do obrotu (art. 72)', [
      'Plan monitorowania po wprowadzeniu do obrotu',
    ]],
  ],
  cs: [
    ['1. Obecný popis systému AI', [
      'Určený účel', 'Poskytovatel', 'Verze a datum uvedení na trh',
      'Hardwarové požadavky / forma poskytování', 'Interakce s externím hardwarem/softwarem',
    ]],
    ['2. Podrobný popis prvků a procesu vývoje', [
      'Metody vývoje a použité nástroje', 'Architektura systému a výpočetní zdroje',
      'Požadavky na data (trénovací, validační a testovací data; původ, příprava)',
      'Opatření lidského dohledu (čl. 14)',
      'Předem stanovené změny a kontinuita shody',
    ]],
    ['3. Monitorování, fungování a kontrola', [
      'Schopnosti a výkonnostní omezení (metriky přesnosti)',
      'Předvídatelné nezamýšlené výsledky a zdroje rizik', 'Specifikace vstupních dat',
    ]],
    ['4. Systém řízení rizik (čl. 9)', ['Popis procesu řízení rizik']],
    ['5. Změny v průběhu životního cyklu', ['Historie změn a proces aktualizací']],
    ['6. Použité harmonizované normy a specifikace', [
      'Seznam norem (např. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. EU prohlášení o shodě', ['Kopie prohlášení o shodě (čl. 47)']],
    ['8. Hodnocení po uvedení na trh (čl. 72)', [
      'Plán monitorování po uvedení na trh',
    ]],
  ],
  sk: [
    ['1. Všeobecný opis systému AI', [
      'Zamýšľaný účel', 'Poskytovateľ', 'Verzie a dátum uvedenia na trh',
      'Hardvérové požiadavky / forma poskytovania', 'Interakcia s externým hardvérom/softvérom',
    ]],
    ['2. Podrobný opis prvkov a procesu vývoja', [
      'Metódy vývoja a použité nástroje', 'Architektúra systému a výpočtové zdroje',
      'Požiadavky na dáta (trénovacie, validačné a testovacie dáta; pôvod, príprava)',
      'Opatrenia ľudského dohľadu (čl. 14)',
      'Vopred určené zmeny a kontinuita zhody',
    ]],
    ['3. Monitorovanie, fungovanie a kontrola', [
      'Schopnosti a výkonnostné obmedzenia (metriky presnosti)',
      'Predvídateľné nezamýšľané výsledky a zdroje rizík', 'Špecifikácia vstupných dát',
    ]],
    ['4. Systém riadenia rizík (čl. 9)', ['Opis procesu riadenia rizík']],
    ['5. Zmeny počas životného cyklu', ['História zmien a proces aktualizácií']],
    ['6. Použité harmonizované normy a špecifikácie', [
      'Zoznam noriem (napr. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. EÚ vyhlásenie o zhode', ['Kópia vyhlásenia o zhode (čl. 47)']],
    ['8. Hodnotenie po uvedení na trh (čl. 72)', [
      'Plán monitorovania po uvedení na trh',
    ]],
  ],
  ro: [
    ['1. Descrierea generală a sistemului de IA', [
      'Scop preconizat', 'Furnizor', 'Versiuni și data introducerii pe piață',
      'Cerințe hardware / forma de punere la dispoziție', 'Interacțiunea cu hardware/software extern',
    ]],
    ['2. Descrierea detaliată a elementelor și a procesului de dezvoltare', [
      'Metode de dezvoltare și instrumente utilizate', 'Arhitectura sistemului și resurse de calcul',
      'Cerințe privind datele (date de antrenare, validare și testare; proveniență, pregătire)',
      'Măsuri de supraveghere umană (art. 14)',
      'Modificări predeterminate și continuitatea conformității',
    ]],
    ['3. Monitorizare, funcționare și control', [
      'Capacități și limite de performanță (metrici de acuratețe)',
      'Rezultate neintenționate previzibile și surse de risc', 'Specificația datelor de intrare',
    ]],
    ['4. Sistemul de gestionare a riscurilor (art. 9)', ['Descrierea procesului de gestionare a riscurilor']],
    ['5. Modificări pe parcursul ciclului de viață', ['Istoricul modificărilor și procesul de actualizare']],
    ['6. Standarde armonizate și specificații aplicate', [
      'Lista standardelor (de ex. ISO/IEC 42001, ISO/IEC 23894)',
    ]],
    ['7. Declarația UE de conformitate', ['Copie a declarației de conformitate (art. 47)']],
    ['8. Evaluarea după introducerea pe piață (art. 72)', [
      'Plan de monitorizare ulterioară introducerii pe piață',
    ]],
  ],
};

/**
 * Erzeugt das Grundgerüst der technischen Dokumentation nach Annex IV.
 *
 * Vorbefüllte Abschnitte stammen aus den Wizard-Antworten; offene Punkte
 * sind als Platzhalter markiert.
 *
 * @param system - Bewertetes KI-System
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil für den Berichtskopf (optional)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function annexIVSkeleton(
  system: AISystem,
  pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const ANNEX_IV_TITLE: Readonly<Record<Locale, string>> = {
    de: 'Technische Dokumentation (Annex IV) — Grundgerüst',
    en: 'Technical documentation (Annex IV) — skeleton',
    fr: 'Documentation technique (annexe IV) — trame',
    it: 'Documentazione tecnica (allegato IV) — struttura di base',
    es: 'Documentación técnica (anexo IV) — esqueleto',
    pl: 'Dokumentacja techniczna (załącznik IV) — szkielet',
    cs: 'Technická dokumentace (příloha IV) — základní struktura',
    sk: 'Technická dokumentácia (príloha IV) — základná štruktúra',
    ro: 'Documentația tehnică (anexa IV) — schelet',
  };
  const lines = [header(ANNEX_IV_TITLE[locale], system, pack, today, locale, profile)];

  const prefilled: Readonly<Record<string, string>> = {
    [ANNEX_IV_SECTIONS[locale][0]?.[1][0] ?? '']: system.purpose,
    [ANNEX_IV_SECTIONS[locale][0]?.[1][1] ?? '']: system.vendor,
  };

  for (const [section, items] of ANNEX_IV_SECTIONS[locale]) {
    lines.push(`## ${section}`, '');
    for (const item of items) {
      const value = prefilled[item];
      lines.push(`- **${item}:** ${value && value.trim() !== '' ? value : s.todo}`);
    }
    lines.push('');
  }

  return lines.join('\n');
}

/**
 * Erzeugt das KI-Inventar über alle registrierten Systeme als Markdown.
 *
 * @param systems - Alle registrierten KI-Systeme
 * @param pack - Regulatorischer Content-Pack
 * @param today - Stichtag im ISO-Format
 * @param profile - Firmenprofil für den Berichtskopf (optional)
 * @param locale - Dokumentsprache (Default: Deutsch)
 */
export function inventoryReport(
  systems: readonly AISystem[],
  pack: ContentPack,
  today: string,
  profile?: CompanyProfile,
  locale: Locale = 'de',
): string {
  const s = docStrings(locale);
  const company = profile && profile.name.trim() !== '' ? `${profile.name} · ` : '';
  const lines = [
    `# ${s.inventory.title}`,
    '',
    `${company}${s.inventory.asOf}: ${formatDocDate(today, locale)} · Content-Pack v${pack.version}`,
    '',
    s.disclaimer,
    '',
    `${s.inventory.count}: **${systems.length}**`,
    '',
    `| ${s.inventory.colSystem} | ${s.inventory.colPurpose} | ${s.inventory.colRole} | ${s.inventory.colRisk} | ${s.inventory.colOwner} |`,
    '|---|---|---|---|---|',
  ];
  for (const sys of systems) {
    lines.push(
      `| ${sys.name} | ${sys.purpose || '—'} | ${s.role[sys.answers.role]} | ${
        s.risk[sys.classification.riskClass]
      } | ${sys.owner || '—'} |`,
    );
  }
  return lines.join('\n');
}
