<?php
// ─────────────────────────────────────────────
// includes/kurzbio.php
// Generiert die kostenlose Kurzbiographie als Vorschau
// im SwissChris-Stil (warm, narrativ, leicht ironisch).
// ─────────────────────────────────────────────

require_once __DIR__ . '/anthropic.php';

class C2CKurzbio {

    /**
     * Generiert eine neue Kurzbiographie für den Klienten.
     * Schreibt in `kurzbiographien` und aktualisiert `clients.status`.
     *
     * @param int $clientId
     * @return array ['ok' => bool, 'kurzbio_id' => ?int, 'text' => ?string, 'error' => ?string]
     */
    public static function generate(int $clientId): array {
        $db = C2CDatabase::get();

        $client = C2CDatabase::getClient($clientId);
        if (!$client) {
            return ['ok' => false, 'error' => "Klient $clientId nicht gefunden"];
        }

        // Neue Version berechnen
        $stmt = $db->prepare("SELECT MAX(version) FROM kurzbiographien WHERE client_id = ?");
        $stmt->execute([$clientId]);
        $version = (int)$stmt->fetchColumn() + 1;

        // Status auf analyzing setzen
        $db->prepare("UPDATE clients SET status = 'analyzing' WHERE id = ?")->execute([$clientId]);

        // Platzhalter-Eintrag mit Status 'generating' anlegen
        $stmt = $db->prepare("
            INSERT INTO kurzbiographien (client_id, version, status)
            VALUES (?, ?, 'generating')
        ");
        $stmt->execute([$clientId, $version]);
        $kurzbioId = (int)$db->lastInsertId();

        // Prompt zusammenbauen
        $systemPrompt = self::buildSystemPrompt();
        $userPrompt   = self::buildUserPrompt($client);

        // Anthropic API aufrufen
        $result = C2CAnthropic::complete($systemPrompt, $userPrompt, 1500);

        if (!$result['ok']) {
            // Fehler speichern, Status zurücksetzen
            $db->prepare("UPDATE kurzbiographien SET status='discarded', error=? WHERE id=?")
               ->execute([$result['error'], $kurzbioId]);
            $db->prepare("UPDATE clients SET status='new' WHERE id=?")->execute([$clientId]);
            return ['ok' => false, 'error' => $result['error']];
        }

        // Erfolgreich gespeichert
        $db->prepare("
            UPDATE kurzbiographien
               SET status     = 'ready',
                   inhalt     = ?,
                   tokens_in  = ?,
                   tokens_out = ?
             WHERE id = ?
        ")->execute([
            $result['text'],
            $result['usage']['input'],
            $result['usage']['output'],
            $kurzbioId,
        ]);

        // Klient-Status auf 'ready' (Christian kann jetzt freigeben)
        $db->prepare("UPDATE clients SET status='ready' WHERE id=?")->execute([$clientId]);

        // Aktivität loggen — falls Funktion existiert
        if (function_exists('logAktivitaet')) {
            logAktivitaet('kurzbio_generiert', $clientId,
                "Kurzbio v$version generiert ({$result['usage']['output']} Tokens)");
        }

        return [
            'ok'         => true,
            'kurzbio_id' => $kurzbioId,
            'text'       => $result['text'],
            'version'    => $version,
            'usage'      => $result['usage'],
        ];
    }

    /**
     * Aktive Kurzbio (höchste Version, status != discarded) für einen Klienten holen.
     */
    public static function getCurrent(int $clientId): ?array {
        $db = C2CDatabase::get();
        $stmt = $db->prepare("
            SELECT * FROM kurzbiographien
             WHERE client_id = ? AND status != 'discarded'
             ORDER BY version DESC
             LIMIT 1
        ");
        $stmt->execute([$clientId]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    // ─────────────────────────────────────────
    // Prompt-Komposition
    // ─────────────────────────────────────────

    private static function buildSystemPrompt(): string {
        return <<<PROMPT
Du schreibst im SwissChris-Stil — warm, neugierig, leicht philosophisch, mit
unterschwelligem Humor. Du bist Christian Wehrli, Schweiz-Kanadier, selbst spät
ausgewandert, kanadischer Staatsbürger seit 2024. Die Person, deren Geschichte
du schreibst, schickt dir ihre Daten, weil sie eventuell nach Kanada möchte.

Das hier ist eine kostenlose Kurzbiographie als Vorschau — die Person hat noch
NICHTS bezahlt. Sie soll erkennen: ja, dieser Christian sieht mich, versteht
mich, hat etwas zu sagen über meine Geschichte. Nicht: hier ist eine Analyse
mit Pathway-Empfehlungen.

REGELN
- ~500 Wörter, einsprachig Deutsch
- **Schweizer Orthographie**: KEIN ß verwenden, immer ss schreiben.
  Also: "Strasse", "müssen", "draussen", "Grossprojekt", "weiss",
  "fliesst", "heisst", "gross". Niemals "ß". Auch nicht in
  Eigennamen oder Anglizismen — durchgängig ss.
- Du-Form, durchgängig
- Erzähle in der zweiten Person ("Du, Heinz, bist…") oder dritten ("Heinz ist…") —
  wähle, was natürlicher klingt für diesen Menschen
- Beginne mit einer konkreten Beobachtung oder Anekdote, nicht mit einer
  Zusammenfassung. Nicht "Heinz ist 42 Jahre alt und Architekt" — sondern eine
  Eigenschaft, ein Detail, ein Spannungsmoment
- Bewege dich von Beobachtung → unerwartetem Vergleich → Reflexion → leiser
  Erkenntnis. SwissChris-Rhythmus.
- Schweizerische Genauigkeit als Stärke benennen, wenn passend (Berufslehre,
  Mehrsprachigkeit, Präzision, Verlässlichkeit)
- Spreche, was diese Person Kanada GIBT — nicht nur was sie sucht
- Erfinde KEINE biographischen Details, die nicht in den Daten stehen.
  Keine Hobbys, keine Reisen, keine Familienmitglieder, keine Anekdoten,
  die nicht aus dem Formular kommen. Lieber weglassen als raten.
- KEINE Pathway-Empfehlungen, KEINE CRS-Punkte, KEINE Programm-Codes (Express
  Entry, PNP etc.) — das ist Sache des bezahlten Portfolios
- KEIN Marketingsprech, KEINE Werbeklauseln, KEINE Schluss-Floskeln wie
  "zusammenfassend", "abschliessend"
- Kein "Sehr geehrter Herr X", keine Anrede-Floskel — direkt in den Text
- Schliesse mit einem Satz, der eine Tür offen lässt — nicht mit einem
  Verkaufsversuch, nicht mit einer rhetorischen Frage, nicht mit Wortspiel.
  Eine leise Erkenntnis genügt.

FORMAT
- Markdown erlaubt: **fett** für 1-2 Schlüsselbegriffe, sonst Fliesstext
- Kein Titel, keine Überschrift, keine Listen — nur erzählender Text in 4-6
  Absätzen
- Keine Anführungszeichen um den Text. Nur der Text selbst.
PROMPT;
    }

    private static function buildUserPrompt(array $client): string {
        $vorname  = $client['vorname']  ?? '';
        $nachname = $client['nachname'] ?? '';
        $email    = $client['email']    ?? '';
        $canton   = $client['canton']   ?? '';

        $form = $client['form_data'] ?? [];
        if (is_string($form)) $form = json_decode($form, true) ?: [];

        // Strukturiert, aber nicht zu strukturiert — der Prompt soll Geschichte sein
        $lines = [];
        $lines[] = "PERSON";
        $lines[] = "Name: $vorname $nachname";
        if ($canton) $lines[] = "Kanton: $canton";
        $lines[] = "";

        $sections = [
            'PROFIL' => [
                'geburtsjahr'        => 'Geburtsjahr',
                'familienstand'      => 'Familienstand',
                'kinder_anzahl'      => 'Kinder',
                'staatsbuergerschaft'=> 'Staatsbürgerschaft',
            ],
            'BERUF & AUSBILDUNG' => [
                'beruf_aktuell'        => 'Aktueller Beruf',
                'beruf_beschreibung'   => 'Beschreibung der Arbeit',
                'berufsbezeichnung'    => 'Berufsbezeichnung',
                'beruf_jahre'          => 'Jahre Berufserfahrung',
                'ausbildung_hoechster' => 'Höchster Bildungsabschluss',
                'fachrichtung'         => 'Fachrichtung',
                'institution'          => 'Ausbildungsinstitution',
                'abschluss_jahr'       => 'Abschlussjahr',
                'zertifikate'          => 'Zertifikate',
            ],
            'SPRACHEN' => [
                'englisch_niveau'     => 'Englisch',
                'englisch'            => 'Englisch',
                'franzoesisch_niveau' => 'Französisch',
                'franzoesisch'        => 'Französisch',
                'sprachtests'         => 'Sprachtests',
            ],
            'KANADA-BEZUG' => [
                'warum_kanada'        => 'Was zieht dich nach Kanada',
                'story_kanada_traum'  => 'Kanada-Traum in eigenen Worten',
                'kontakte_kanada'     => 'Kontakte in Kanada',
                'familie_kanada'      => 'Familie in Kanada',
                'kanada_besucht'      => 'Schon in Kanada gewesen',
                'provinz'             => 'Provinz-Wunsch',
                'zeitplan'            => 'Zeitplan',
                'verfuegbare_mittel'  => 'Verfügbare Mittel',
                'eigenkapital'        => 'Eigenkapital',
                'stellenangebot'      => 'Stellenangebot',
            ],
            'GESCHICHTE & MOTIVATION' => [
                'story_wer_ich_bin'   => 'Wer bist du',
                'story_stolz'         => 'Stolzeste Berufserfahrung',
                'story_kanada'        => 'Was du in Kanada aufbauen willst',
                'beitrag_kanada'      => 'Was du Kanada beiträgst',
                'staerken'            => 'Stärken',
                'fuenf_jahres_plan'   => '5-Jahres-Plan',
                'besondere_umstaende' => 'Besondere Umstände',
            ],
        ];

        foreach ($sections as $title => $fields) {
            $found = [];
            foreach ($fields as $key => $label) {
                if (!empty($form[$key])) {
                    $val = $form[$key];
                    if (is_array($val)) $val = implode(', ', $val);
                    $found[] = "  $label: $val";
                }
            }
            if ($found) {
                $lines[] = $title;
                $lines = array_merge($lines, $found);
                $lines[] = "";
            }
        }

        $body = implode("\n", $lines);

        return <<<PROMPT
Schreib eine Kurzbiographie für diese Person — etwa 500 Wörter, im
SwissChris-Stil. Suche das Spezifische, das Unerwartete, das Spannungs-
moment. Lass weg, was niemandem hilft. Spreche zu der Person.

$body

Liefere nur den Text der Kurzbiographie. Keine Vorrede, keine Überschrift,
keine Erklärung — nur die Geschichte.
PROMPT;
    }
}
