// Loop 12 PR 2: Adapter kanonisches presentation_package → ExportConfig.
//
// Die dünne Wiedergabe-Schicht der Exit-Kriterien: „keine Exportvariante
// rechnet selbst" und „alle Zahlen stimmen mit dem kanonischen JSON überein"
// sind hier strukturell erzwungen — dieser Adapter ÜBERTRÄGT die
// Folien-Struktur des kanonischen Dokuments 1:1 in das generische
// ExportConfig-Format (lib/export/export-service.ts, PPTX/PDF-Renderer);
// jede Tabellenzeile behält ihre Referenz-Kennung (Difference-/Finding-/
// Action-ID) als erste Spalte. Keine Aggregation, keine Formatierung von
// Zahlen (die kanonischen decimal-Strings bleiben wörtlich), kein Zugriff
// auf Engine oder DB. Pure.

import type { ExportConfig, ExportSection } from './export-service'

interface SlideLike {
  slide_id: string
  title_de: string
  kind: string
  content: Record<string, unknown>
}

function rowsFrom(content: Record<string, unknown>, columns: ReadonlyArray<[label: string, key: string]>): {
  headers: string[]
  rows: (string | number)[][]
} {
  // Nicht-Objekt-Zeilen explizit aussortiert statt implizit zu crashen
  // (Review-Befund, defense-in-depth) — und die verworfene Menge sichtbar
  // gemacht statt stumm geschluckt.
  const rawAll = Array.isArray(content.rows) ? (content.rows as unknown[]) : []
  const raw = rawAll.filter((r): r is Record<string, unknown> => typeof r === 'object' && r !== null)
  const verworfen = rawAll.length - raw.length
  const rows = raw.map((r) => columns.map(([, key]) => (r[key] === undefined || r[key] === null ? '—' : String(r[key]))))
  if (verworfen > 0) {
    rows.push(columns.map((_, i) => (i === 0 ? `⚠ ${verworfen} unlesbare Zeile(n) verworfen` : '')))
  }
  return { headers: columns.map(([label]) => label), rows }
}

/**
 * Baut das ExportConfig aus den kanonischen Folien. `slides` ist die
 * presentation_package.content.slides-Struktur des kanonischen Dokuments
 * (buildPresentationPackage) — unbekannte Folien-Arten erscheinen als
 * Text-Hinweis statt still zu verschwinden.
 */
export function presentationPackageToExportConfig(
  slides: ReadonlyArray<SlideLike>,
  meta: { titleDe: string; fileName: string; subtitleDe?: string },
): ExportConfig {
  const sections: ExportSection[] = slides.map((slide) => {
    if (slide.kind === 'overview') {
      const c = slide.content
      return {
        title: slide.title_de,
        items: [
          { label: 'Differenzen', value: String(c.difference_count ?? '—') },
          { label: 'Datenqualitäts-Befunde', value: String(c.finding_count ?? '—') },
          { label: 'Maßnahmen', value: String(c.action_count ?? '—') },
        ],
      }
    }
    if (slide.kind === 'top_differences') {
      return {
        title: slide.title_de,
        table: rowsFrom(slide.content, [
          ['Kennung', 'difference_id'],
          ['Kennzahl', 'metric_id'],
          ['Status', 'difference_status'],
          ['Δ absolut', 'delta_absolute'],
          ['Einheit', 'unit'],
        ]),
      }
    }
    if (slide.kind === 'data_quality') {
      return {
        title: slide.title_de,
        table: rowsFrom(slide.content, [
          ['Kennung', 'finding_id'],
          ['Schwere', 'severity'],
          ['Aussage', 'statement'],
        ]),
      }
    }
    if (slide.kind === 'actions') {
      return {
        title: slide.title_de,
        table: rowsFrom(slide.content, [
          ['Kennung', 'action_id'],
          ['Titel', 'title'],
          ['Priorität', 'priority'],
        ]),
      }
    }
    return {
      title: slide.title_de,
      text: `Folien-Art „${slide.kind}" wird von diesem Renderer noch nicht dargestellt (Inhalt im kanonischen JSON vollständig).`,
    }
  })

  return {
    title: meta.titleDe,
    ...(meta.subtitleDe !== undefined ? { subtitle: meta.subtitleDe } : {}),
    sections,
    fileName: meta.fileName,
  }
}
