#!/usr/bin/env python3
"""
The Lethe — Absence Record
Records what ISN'T. Structured absence categories:
- decayed_memory: Memory fell below retention threshold
- dropped_signal: Signal entered but never propagated
- unresolved_pattern: Pattern detected but never completed
- expected_missing: Signal predicted but never arrived
- convergence_abandoned: Topic dropped out of active processing
- silence_prolonged: Extended period with no signal input

Lethe is not poetic. It is precise. Every absence has a category and a reason.
"""
from datetime import datetime, timedelta
from brain.state import log_absence, recent_absences, ABSENCE_CATEGORIES, load_state, LETeth_FILE

def check_prolonged_silence(threshold_hours=24):
    """Check if system has been silent for threshold hours."""
    state = load_state()
    last_signal = state.get("last_signal_at")
    if not last_signal:
        return False

    try:
        last_time = datetime.fromisoformat(last_signal)
        elapsed = datetime.now() - last_time
        if elapsed > timedelta(hours=threshold_hours):
            log_absence(
                category="silence_prolonged",
                signal_id="system",
                expected_at=None,
                reason=f"No signal for {elapsed.total_seconds() / 3600:.1f} hours"
            )
            return True
    except:
        pass
    return False

def process(signal):
    """
    Process signal through lethe.
    Checks for absence categories in the signal content itself,
    and flags if the signal resolves a previously missing expected signal.
    Reads: signal['raw_input'], signal['signal_id']
    Writes: signal['lethe'] block
    Returns: modified signal
    """
    raw = signal.get("raw_input", "").lower()
    signal_id = signal.get("signal_id", "unknown")
    lethe_block = signal.get("lethe", {})

    # Scan for absence references in signal content
    absence_map = {
        "decayed_memory": ["decay", "forgot", "faded", "lost memory", "can't remember"],
        "dropped_signal": ["didn't arrive", "never got", "missing signal", "dropped"],
        "unresolved_pattern": ["unfinished", "incomplete", "pattern without end", "unresolved"],
        "expected_missing": ["expected", "waiting for", "should have arrived", "predicted but missing"],
        "convergence_abandoned": ["stopped caring", "gave up on", "不再关注", "dropped the thread"],
        "silence_prolonged": ["too quiet", "prolonged silence", "nothing happening", "dead air"],
    }

    for category, keywords in absence_map.items():
        if any(kw in raw for kw in keywords):
            if category not in lethe_block.get("absence_categories", []):
                lethe_block["absence_categories"].append(category)
                log_absence(
                    category=category,
                    signal_id=signal_id,
                    reason=f"Detected in signal content: {raw[:60]}..."
                )

    lethe_block["decay_applied"] = True
    signal["lethe"] = lethe_block

    return signal
