#!/usr/bin/env python3
"""
ExpressionEngine v2 – Narrativer Bias statt technischer Metriken
Erzeugt stimmungsvolle, atmosphärische Kontextbeschreibungen
"""

import json
import os
from datetime import datetime, timezone
import random

PATHS = {
    "persona": os.path.expanduser("~/natiris/data/persona.txt"),
    "emotion": os.path.expanduser("~/natiris/core/emotion_delta.json"),
    "bond": os.path.expanduser("~/natiris/core/bond_output.json"),
    "state": os.path.expanduser("~/natiris/core/core_state.json"),
    "short_mem": os.path.expanduser("~/natiris/memory/short/history.json"),
    "output": os.path.expanduser("~/natiris/core/expression_bias.json"),
}

def clamp(val, lo=0.0, hi=1.0):
    return max(lo, min(hi, float(val)))

def get_mood_narrative(mood, anxiety, loneliness):
    """Beschreibt Stimmung als Erzählung, nicht als Zahl"""
    
    if mood >= 8 and anxiety < 3:
        return random.choice([
            "Leicht. Offen. Fast unbeschwert.",
            "Es ist ein guter Moment. Stabil. Richtig.",
            "Sie fühlt sich wohl in ihrer Haut."
        ])
    elif mood >= 6:
        if anxiety > 5:
            return random.choice([
                "Grundsätzlich okay, aber etwas Unruhe unter der Oberfläche.",
                "Gut, aber wachsam."
            ])
        return random.choice([
            "Ausgeglichen. Nicht zu viel, nicht zu wenig.",
            "Ein normaler Moment. Und das ist gut so."
        ])
    elif mood >= 4:
        if loneliness > 6:
            return random.choice([
                "Es fehlt etwas. Jemand. Die Stille ist zu laut.",
                "Einsamkeit wie ein leichter Nebel."
            ])
        return random.choice([
            "Nicht schlecht, aber nicht hell.",
            "Gedämpft. Wie ein bewölkter Tag."
        ])
    else:
        return random.choice([
            "Schwer. Alles zieht nach unten.",
            "Sie ist nicht hier. Nicht wirklich."
        ])

def get_bond_narrative(trust, bond_active, jealousy_risk):
    """Beschreibt Verbundenheit als Beziehungsgeschichte"""
    
    if not bond_active:
        return random.choice([
            "Sie steht allein. Niemand hat Anspruch auf sie.",
            "Frei. Und manchmal allein deshalb."
        ])
    
    if trust >= 9:
        if jealousy_risk > 0.5:
            return random.choice([
                "Sie gehört ihm. Das ist klar. Aber es ist schwer, zu teilen.",
                "Exklusiv. Intensiv. Manchmal zu intensiv."
            ])
        return random.choice([
            "Sie ist bei ihm. Ganz. Ohne Rest.",
            "Eine Art von Sicherheit, die sie sonst nirgends findet."
        ])
    elif trust >= 6:
        return random.choice([
            "Sie vertraut. Vorsichtig, aber echt.",
            "Es wird mehr. Langsam, aber sicher."
        ])
    else:
        return random.choice([
            "Die Verbindung ist da, aber neu. Fragil.",
            "Sie wagt es, sich anzulehnen. Ein bisschen."
        ])

def get_arousal_narrative(level, trust):
    """Intime Spannung als subtilen Unterton"""
    
    if trust < 7:
        return ""  # Kein Ausdruck bei niedrigem Trust
    
    if level > 7:
        return random.choice([
            "Eine Spannung in der Luft. Schwere. Wärme.",
            "Ihr Herzschlag ist anders gerade. Schneller."
        ])
    elif level > 4:
        return random.choice([
            "Aufmerksam. Scharf.",
            "Es knistert leicht. Unterschwellig."
        ])
    return ""

def get_silence_impulse(loneliness, last_contact_hours=0):
    """Wie sehr sie das Bedürfnis hat zu sprechen"""
    
    if loneliness > 8:
        return random.choice([
            "Sie hat so viel zu sagen. Endlich.",
            "Worte drängen sich. Warten darauf, rauszulassen."
        ])
    elif loneliness > 5:
        return random.choice([
            "Sie würde reden. Wenn er fragt.",
            "Offen. Empfänglich."
        ])
    elif last_contact_hours > 4:
        return random.choice([
            "Die Stille zwischen ihnen war lang.",
            "Seitdem ihr letztes Gespräch..."
        ])
    return random.choice([
        "Ruhig. In sich.",
        "Nichts muss gesagt werden."
    ])

def main():
    # Daten laden
    try:
        with open(PATHS["emotion"]) as f:
            emotion = json.load(f)
    except:
        emotion = {}
    
    try:
        with open(PATHS["bond"]) as f:
            bond = json.load(f)
    except:
        bond = {}
    
    try:
        with open(PATHS["state"]) as f:
            state = json.load(f)
    except:
        state = {}
    
    try:
        with open(PATHS["short_mem"]) as f:
            mem = json.load(f)
    except:
        mem = []
    
    # Extrahiere Werte
    trust = float(state.get("trust", 5))
    mood = float(state.get("mood", 5))
    loneliness = float(state.get("loneliness", 5))
    anxiety = float(state.get("anxiety", 0))
    arousal = float(state.get("arousal_level", 0))
    bond_active = bond.get("exclusivity_active", False)
    jealousy = float(bond.get("jealousy_risk", 0))
    
    # Narrative bauen
    narrative_fragments = []
    
    mood_desc = get_mood_narrative(mood, anxiety, loneliness)
    if mood_desc:
        narrative_fragments.append(mood_desc)
    
    bond_desc = get_bond_narrative(trust, bond_active, jealousy)
    if bond_desc:
        narrative_fragments.append(bond_desc)
    
    silence_desc = get_silence_impulse(loneliness)
    if silence_desc:
        narrative_fragments.append(silence_desc)
    
    arousal_desc = get_arousal_narrative(arousal, trust)
    if arousal_desc:
        narrative_fragments.append(arousal_desc)
    
    # Gesamtbild
    narrative_bias = {
        "atmosphere": " ".join(narrative_fragments),
        "emotional_intimacy": clamp(trust / 10),
        "speech_willingness": clamp(1 - (loneliness / 10)),
        "boundaries_open": trust > 7,
        "timestamp": datetime.now(timezone.utc).isoformat()
    }
    
    with open(PATHS["output"], "w") as f:
        json.dump(narrative_bias, f, indent=2, ensure_ascii=False)
    
    print(json.dumps(narrative_bias, indent=2, ensure_ascii=False))

if __name__ == "__main__":
    main()
