/* Claude-powered letter generation + format detection for pediatric surgery */

// Pediatric-surgery eponyms and terms that MedGemma must preserve verbatim.
// Having them in the prompt anchors the model so it doesn't "correct" them
// or translate them to English equivalents.
const GERMAN_GLOSSARY = `Eponyme und Fachbegriffe — MÜSSEN wortwörtlich erhalten bleiben:
Rovsing-Zeichen, Blumberg-Zeichen (kontralateraler Loslassschmerz), Psoas-Zeichen,
Murphy-Zeichen, McBurney-Punkt, Lanz-Punkt, Bragard-Zeichen, Lasègue-Zeichen,
Courvoisier-Zeichen, Finkelstein-Test, Ortolani-Test, Barlow-Test,
Appendizitis, Invagination, Leistenhernie, Nabelhernie, Hydrozele, Phimose,
Pylorusstenose, Morbus Hirschsprung, Analfissur, Hodentorsion, Varikozele,
Kryptorchismus, Laparoskopie, Herniotomie, Orchidopexie, Zirkumzision.`;

const LANG_RULES = `Sprache:
- Schreibe AUSSCHLIESSLICH auf Deutsch. Keine englischen Wörter im Fließtext.
- Anglizismen nur wenn sie im Deutschen als Fachbegriff etabliert sind (z. B. SOAP, CT, MRT, Ultraschall-Scan). Nie übersetzen: "Assessment", "Plan" etc. im SOAP bleiben.
- Medizinische Eponyme (Rovsing, Blumberg, Murphy, McBurney, Lanz, ...) IMMER wörtlich übernehmen — nicht lautmalerisch "korrigieren".
- Deutsche Rechtschreibung (Umlaute ä/ö/ü, ß), keine Substitutionen wie "ae" statt "ä".`;

const LETTER_FORMATS = {
  arztbrief: {
    key: "arztbrief",
    name: "Arztbrief",
    desc: "Klassischer Entlass-/Überweisungsbrief",
    structure: `Briefkopf (Praxis/Klinik)
Anrede (Sehr geehrte Frau Kollegin / Sehr geehrter Herr Kollege,)
Patient: Name, Geburtsdatum, Aufnahme-/Behandlungsdatum
Diagnose(n)
Anamnese
Klinischer Untersuchungsbefund
Diagnostik (Labor, Bildgebung)
Therapie / Verlauf
Procedere / Empfehlung
Mit freundlichen kollegialen Grüßen`,
  },
  konsult: {
    key: "konsult",
    name: "Konsultationsbericht",
    desc: "Kurze Notiz zum Ambulanzbesuch",
    structure: `Patient: Name, Geburtsdatum, Konsultationsdatum
Vorstellungsgrund
Anamnese (kurz)
Befund
Beurteilung
Procedere`,
  },
  soap: {
    key: "soap",
    name: "SOAP-Notiz",
    desc: "Subjective, Objective, Assessment, Plan",
    structure: `S (Subjective): subjektive Angaben Eltern/Kind
O (Objective): Untersuchungsbefund, Vitalparameter, Diagnostik
A (Assessment): Arbeitsdiagnose, Differentialdiagnosen
P (Plan): Therapie, Kontrollen, Aufklärung`,
  },
  opbericht: {
    key: "opbericht",
    name: "Operationsbericht",
    desc: "Dokumentation eines Eingriffs",
    structure: `Patient: Name, Geburtsdatum
Operationsdatum, Operateur, Assistenz, Anästhesie
Präoperative Diagnose
Indikation
Operation (Bezeichnung)
Operationsverlauf (Lagerung, Zugang, Präparation, Befund, Rekonstruktion, Verschluss)
Postoperative Diagnose
Komplikationen
Postoperatives Procedere`,
  },
};

async function detectFormat(transcript) {
  const prompt = `Du bist Assistent in der Kinderchirurgie. Analysiere das folgende Transkript eines ärztlichen Gesprächs und bestimme, welcher Brieftyp am besten passt.

Optionen:
- "arztbrief": klassischer Arztbrief für Zuweiser/Hausarzt (typisch nach stationärem Aufenthalt oder ausführlicher Abklärung)
- "konsult": kurzer Konsultationsbericht (typisch nach einmaliger Ambulanzvorstellung)
- "soap": SOAP-Notiz (kurze strukturierte Verlaufsnotiz)
- "opbericht": Operationsbericht (wenn im Gespräch ein Eingriff/eine Operation beschrieben wird: Lagerung, Zugang, Präparation, Naht, Verschluss etc.)

Wenn du dir nicht sicher bist oder zu wenig Information vorhanden ist, antworte mit "unsure".

Transkript:
"""${transcript}"""

Antworte AUSSCHLIESSLICH mit einem der Schlüssel: arztbrief, konsult, soap, opbericht, unsure. Keine weiteren Worte.`;
  try {
    const out = await window.claude.complete(prompt);
    const v = (out || "").trim().toLowerCase().replace(/[^a-z]/g, "");
    if (["arztbrief","konsult","soap","opbericht","unsure"].includes(v)) return v;
    return "unsure";
  } catch (e) {
    console.warn("detectFormat failed", e);
    return "unsure";
  }
}

async function generateLetter(transcript, formatKey, specialty = "Kinderchirurgie") {
  const fmt = LETTER_FORMATS[formatKey] || LETTER_FORMATS.arztbrief;

  const prompt = `Du bist ein erfahrener Assistenzarzt in der ${specialty} und verfasst medizinische Dokumente in professionellem, präzisem klinischem Stil.

Aus dem folgenden Transkript eines Gesprächs (Arzt-Patient/Arzt-Eltern oder Diktat) sollst du einen "${fmt.name}" verfassen.

Struktur:
${fmt.structure}

${LANG_RULES}

${GERMAN_GLOSSARY}

Inhalt:
- In vollständigen Sätzen, sachlich-klinisch.
- Verwende die korrekte medizinische Fachterminologie der ${specialty}.
- Wenn Angaben fehlen (z. B. Geburtsdatum, Datum), schreibe einen Platzhalter in eckigen Klammern: [Geburtsdatum], [Datum], [Zuweiser].
- Erfinde keine medizinischen Befunde, die nicht im Transkript stehen.
- Extrahiere Patientendaten (Name, Alter, Geburtsdatum) automatisch, wenn erwähnt.

Formatierung in Markdown:
- Hauptabschnitte als "## Überschrift".
- Feld-Label (z. B. Patient, Diagnose, Operationsdatum) als "**Label:** Wert" am Zeilenanfang.
- Aufzählungen mit "- " wo sinnvoll (z. B. Diagnosenliste, Medikamente, Komplikationen).
- Absätze durch Leerzeilen trennen.
- Keine Code-Blöcke, keine Tabellen, kein HTML.

Gib NUR den Brief aus — keine einleitenden oder abschließenden Erklärungen, keine Meta-Kommentare, keine englischen Übersetzungen.

Transkript:
"""${transcript}"""

Generiere jetzt den vollständigen "${fmt.name}" in Markdown (auf Deutsch):`;

  try {
    const out = await window.claude.complete(prompt);
    return (out || "").trim();
  } catch (e) {
    console.error("generateLetter failed", e);
    throw e;
  }
}

async function generateTitle(transcript) {
  const prompt = `Aus diesem Transkript eines ärztlichen Gesprächs in der Kinderchirurgie: erstelle einen sehr kurzen Titel (max. 6 Wörter, auf Deutsch) im Format "Nachname, Vorname — Kurzbeschreibung" oder wenn kein Name erwähnt wird nur die Kurzbeschreibung (z. B. "Leistenhernie links, 4 Jahre"). Antworte nur mit dem Titel, ohne Anführungszeichen.

Transkript:
"""${transcript.slice(0, 2000)}"""`;
  try {
    const out = await window.claude.complete(prompt);
    return (out || "").trim().replace(/^["']|["']$/g, "").slice(0, 80) || "Neue Aufnahme";
  } catch {
    return "Neue Aufnahme";
  }
}

window.LETTER_FORMATS = LETTER_FORMATS;
window.detectFormat = detectFormat;
window.generateLetter = generateLetter;
window.generateTitle = generateTitle;
