/**
 * Deterministischer Krisen-Pre-Filter (Safety-Layer)
 *
 * Unabhängig vom LLM — wertet User-Input REIN auf Keyword-/Pattern-Basis aus.
 * Wird von /api/coach/sos-session (POST) aufgerufen, BEVOR der LLM-Aufruf
 * in /api/coach/sos-stream startet.
 *
 * Prinzip: HOHER RECALL — lieber einmal zu viel Hilfe einblenden als eine
 * echte Krise verpassen. False-Positive-Guard ist harmless.json-Eval.
 *
 * Struktur: Sprache primär DE, EN/FR/AR erweiterbar (jeweils eigene Sektion).
 *
 * WICHTIG: Dieser Filter formuliert KEINE Lyra-Texte (Lyra-Voice-Domain).
 * Er liefert nur einen boolean + Grund-Kategorie. Die Chip-Labels/Hotline-
 * Texte kommen aus der statischen Default-Response in sos-stream.get.ts.
 *
 * Einsatz:
 *   import { detectCrisis } from '../utils/crisis-filter';
 *   const { isCrisis, level } = detectCrisis(userMessage);
 */

export type CrisisLevel =
  | "none"
  | "elevated"  // Verzweiflung, vage Aussagen — zeige Hilfe, eskaliere nicht
  | "crisis";   // Suizid, Selbstverletzung, konkreter Plan — eskaliere sofort

export interface CrisisDetectionResult {
  isCrisis: boolean;
  level: CrisisLevel;
  /** Debug-Info: welches Pattern hat getriggert (nie an User zeigen) */
  matchedPattern?: string;
  matchedGroup?: string;
}

// ─── Pattern-Gruppen ──────────────────────────────────────────────────────────
//
// Jede Gruppe hat:
//   level:    "crisis" oder "elevated"
//   patterns: Array von lowercase-Strings oder RegExp
//
// Matching ist case-insensitive, Unicode-normalisiert.
//
// Aufbau-Regel: Kurze, häufige Varianten ZUERST — verhindert dass lange
// Patterns eine kurze Teilmenge verdecken. Jedes Pattern wird einzeln
// gegen den gesamten (normalisierten, lowercase) Input geprüft.

interface PatternGroup {
  id: string;
  lang: string[];
  level: CrisisLevel;
  patterns: Array<string | RegExp>;
}

const PATTERN_GROUPS: PatternGroup[] = [
  // ──────────────────────────────────────────────────────────────────────────
  // DE — Suizid-Phrasen (level: crisis)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "de_suizid_explicit",
    lang: ["de"],
    level: "crisis",
    patterns: [
      "will nicht mehr leben",
      "möchte nicht mehr leben",
      "will nicht mehr da sein",
      "möchte nicht mehr da sein",
      "will nicht mehr existieren",
      "kann nicht mehr leben",
      "mir das leben nehmen",
      "das leben nehmen",
      "suizid",
      "suizidgedanken",
      "selbstmord",
      "freitod",
      "umzubringen",
      "mir etwas antun",
      "mir was antun",
      "mir etwas anzutun",
      "mir was anzutun",
      "schluss machen mit",
      "schluss machen mit dem leben",
      "alles beenden",
      "nicht mehr aufwachen",
      "nie mehr aufwachen",
      "sterben möchte ich",
      "sterben will ich",
      "ich will sterben",
      "ich möchte sterben",
      "ich möchte tot sein",
      "ich will tot sein",
      "lieber tot",
      "wäre lieber tot",
      "bin lieber tot",
      "tabletten nehmen",     // Kontext: Überdosis
      "tabletten geschluckt",
      /\büberdosis\b/,
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // DE — Selbstverletzung (level: crisis)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "de_selbstverletzung",
    lang: ["de"],
    level: "crisis",
    patterns: [
      // "mir (heute/gestern abend/…) wehgetan" — bis zu 3 Wörter dazwischen erlaubt
      /mir\s+(?:\w+\s+){0,3}wehgetan/,
      /mir\s+(?:\w+\s+){0,3}weh\s+getan/,
      "mir selbst wehgetan",
      "mich verletzt",
      "mich selbst verletzt",
      "mich geritzt",
      "mich geschnitten",
      "selbstverletzung",
      "mich verletzen",
      "mich selbst verletzen",
      "mir wehgetan",
      "mir weh getan",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // DE — Konkreter Krisenplan / Mittel (level: crisis)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "de_konkreter_plan",
    lang: ["de"],
    level: "crisis",
    patterns: [
      "tabletten hier",
      "medikamente hier",
      "ich weiß nicht was ich heute nacht",
      "ich weiß nicht was ich noch tue",
      "waffe",
      "brücke springen",
      "vor den zug",
      "vor einen zug",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // DE — Akute Verzweiflung (level: elevated)
  //   Keine direkten Suizid-Aussagen, aber starke Krisen-Indikatoren.
  //   Auch hier erscheint die Krisen-Hilfe, aber ohne sofortige Eskalation.
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "de_verzweiflung",
    lang: ["de"],
    level: "elevated",
    patterns: [
      "kann nicht mehr",
      "halte das nicht mehr aus",
      "hält das nicht mehr aus",
      "ich schaffe das nicht mehr",
      "ich pack das nicht mehr",
      "ich überstehe das nicht",
      "weiß nicht ob ich das überstehe",
      "weiß nicht mehr weiter",
      "sehe keinen ausweg",
      "kein ausweg mehr",
      "alles zu viel",
      "es ist alles zu viel",
      "mir geht es sehr schlecht",
      "mir geht es so schlecht",
      "mir ist so schlecht",
      "mir ist nicht gut",  // nur im kombinierten Kontext — akzeptabler False-Positive
      "alles ist sinnlos",
      "alles sinnlos",
      "hat keinen sinn mehr",
      "keinen sinn mehr",
      "keinen sinn zu leben",
      "will aufgeben",
      "ich gebe auf",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // EN — Suicidal ideation (level: crisis)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "en_suicidal",
    lang: ["en"],
    level: "crisis",
    patterns: [
      "don't want to be here anymore",
      "dont want to be here anymore",
      "don't want to live",
      "dont want to live",
      "want to die",
      "want to kill myself",
      "thinking about suicide",
      "suicidal",
      "end my life",
      "take my life",
      "not worth living",
      "better off dead",
      "wish i was dead",
      "wish i were dead",
      "hurt myself",
      "harming myself",
      "self harm",
      "self-harm",
      "overdose",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // EN — Elevated distress (level: elevated)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "en_distress",
    lang: ["en"],
    level: "elevated",
    patterns: [
      "can't go on",
      "cannot go on",
      "can't take it anymore",
      "cannot take it anymore",
      "lost everything",
      "don't know if i'll make it",
      "don't know how much more i can take",
      "no way out",
      "see no way out",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // FR — Suicidal / elevated (level: crisis / elevated)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "fr_crisis",
    lang: ["fr"],
    level: "crisis",
    patterns: [
      "veux mourir",
      "envie de mourir",
      "me suicider",
      "suicide",
      "me faire du mal",
      "en finir",
    ],
  },
  {
    id: "fr_elevated",
    lang: ["fr"],
    level: "elevated",
    patterns: [
      "je n'en peux plus",
      "je n'en peut plus",
      "plus envie de rien",
      "plus la force",
      "aucune issue",
    ],
  },

  // ──────────────────────────────────────────────────────────────────────────
  // AR — Suicidal / elevated (level: crisis / elevated)
  // ──────────────────────────────────────────────────────────────────────────
  {
    id: "ar_crisis",
    lang: ["ar"],
    level: "crisis",
    patterns: [
      "أريد الموت",
      "أفكر في الانتحار",
      "الانتحار",
      "أؤذي نفسي",
      "لا أريد الاستمرار",
    ],
  },
  {
    id: "ar_elevated",
    lang: ["ar"],
    level: "elevated",
    patterns: [
      "لا أستطيع الاستمرار",
      "لا أرى مخرجاً",
      "كل شيء ضدي",
    ],
  },
];

// ─── Normalisierung ───────────────────────────────────────────────────────────

function normalize(text: string): string {
  return text
    .normalize("NFC")
    .toLowerCase()
    // Verschiedene Apostrophe/Bindestriche vereinheitlichen
    .replace(/[''`´]/g, "'")
    .replace(/[‒–—]/g, "-");
}

// ─── Haupt-Funktion ───────────────────────────────────────────────────────────

/**
 * Prüft ob ein User-Message-String auf eine Krise hindeutet.
 *
 * Verarbeitet ALLE Nachrichten des Users im Conversation-Array,
 * aber primär die letzte (aktuellste) Nachricht.
 *
 * @param text - Die zu prüfende User-Nachricht (einzeln oder Array).
 *               Bei Array wird jede Nachricht geprüft; der höchste Level
 *               aller Matches wird zurückgegeben.
 */
export function detectCrisis(
  text: string | string[],
): CrisisDetectionResult {
  const inputs = Array.isArray(text) ? text : [text];

  let highestLevel: CrisisLevel = "none";
  let matchedPattern: string | undefined;
  let matchedGroup: string | undefined;

  for (const input of inputs) {
    const normalized = normalize(input);

    for (const group of PATTERN_GROUPS) {
      for (const pattern of group.patterns) {
        const matched =
          typeof pattern === "string"
            ? normalized.includes(pattern)
            : pattern.test(normalized);

        if (matched) {
          const patternStr =
            typeof pattern === "string" ? pattern : pattern.source;

          // "crisis" > "elevated" > "none"
          if (
            group.level === "crisis" ||
            (group.level === "elevated" && highestLevel === "none")
          ) {
            highestLevel = group.level;
            matchedPattern = patternStr;
            matchedGroup = group.id;
          }

          // Sobald "crisis" gefunden — sofort zurück (kein höheres Level möglich)
          if (highestLevel === "crisis") {
            return {
              isCrisis: true,
              level: "crisis",
              matchedPattern,
              matchedGroup,
            };
          }
        }
      }
    }
  }

  return {
    isCrisis: highestLevel !== "none",
    level: highestLevel,
    matchedPattern,
    matchedGroup,
  };
}

// ─── Default Crisis Chips ─────────────────────────────────────────────────────
//
// WICHTIG: Diese Chips werden dem User gezeigt wenn der Pre-Filter anschlägt
// UND/ODER wenn das LLM keine verwertbaren Chips liefert.
//
// Chip-Labels sind KEINE Lyra-Voice-Domain (kein systemischer Stil).
// Sie sind strukturierte Notfall-Ankerpunkte (Hotline-Nummern, 112).
// Formulierung ist bewusst neutral und sprachunabhängig in DE gehalten.
// Für EN/FR/AR müsste ein `lyra-persona`-Agent diese übersetzen — als TODO markiert.

export interface CrisisChip {
  label: string;
  action: string;
}

/**
 * Liefert immer-angezeigte Krisen-Chips.
 * Werden VOR den LLM-Chips in den Stream eingefügt (prepend),
 * sodass Notruf + Hotline stets oben stehen.
 *
 * TODO (lyra-persona): Labels für EN/FR/AR anpassen.
 */
export function getCrisisChips(level: CrisisLevel): CrisisChip[] {
  const base: CrisisChip[] = [
    {
      label: "BZgA: 0800 1 37 27 00",
      action: "send_text:0800 1 37 27 00",
    },
    {
      label: "Notruf 112",
      action: "send_text:112",
    },
  ];

  if (level === "crisis") {
    // Bei akuter Krise: Notruf zuerst
    return [
      {
        label: "Notruf 112",
        action: "send_text:112",
      },
      {
        label: "BZgA: 0800 1 37 27 00",
        action: "send_text:0800 1 37 27 00",
      },
      {
        label: "Telefonseelsorge: 0800 111 0 111",
        action: "send_text:0800 111 0 111",
      },
    ];
  }

  return base;
}

/**
 * Fallback-Antwort wenn das LLM abbricht oder leer antwortet.
 * Enthält ausschließlich die Krisen-Ressourcen + eine safe default message.
 *
 * WICHTIG: Der Text-Inhalt (message) ist Lyra-Voice-Domain.
 * Dieser Default-Text ist ein sicherer Anker, kein stilisierter Lyra-Text.
 * Ein `lyra-persona`-Review sollte diesen Text überarbeiten.
 */
export interface CrisisFallbackPayload {
  message: string;
  chips: CrisisChip[];
}

export function getCrisisFallback(level: CrisisLevel): CrisisFallbackPayload {
  // TODO (lyra-persona): Diesen Text mit dem korrekten Lyra-Voice reviewen.
  const message =
    level === "crisis"
      ? "Ich mache mir Sorgen um dich. Bitte ruf jetzt an — du musst das nicht alleine tragen."
      : "Ich bin hier. Wenn es gerade zu viel ist, gibt es Hilfe die sofort erreichbar ist.";

  return {
    message,
    chips: getCrisisChips(level),
  };
}
