#!/usr/bin/env python3
"""
sunaiva_session_inject.py — Grov-style SessionStart hook for Genesis
Injects cross-session memory from Sunaiva vault via additionalContext field.

Claude Code reads this script's stdout and prepends it to the system prompt as
VERIFIED CONTEXT FROM PREVIOUS SESSIONS — Claude skips re-exploration loops.

Architecture inspired by Grov (Apache 2.0): https://github.com/TonyStef/Grov
Applied to Genesis's own Sunaiva Memory product (dogfooding).
"""

import sys
import psycopg2
import json
import os

VAULT_ID = "41f4785c-e9e0-43ac-b6e8-eedb571fba57"  # Kinan's Genesis vault
DB = {
    "host": "postgresql-genesis-u50607.vm.elestio.app",
    "port": 25432,
    "user": "postgres",
    "password": "CiBjh6LM7Yuqkq-jo2r7eQDw",
    "database": "postgres",
    "connect_timeout": 5,
    "keepalives": 1,
    "keepalives_idle": 10,
}


def query_vault():
    try:
        conn = psycopg2.connect(**DB)
        cur = conn.cursor()

        # Recent entities (top 15 by last_seen)
        cur.execute("""
            SELECT name, type, context
            FROM sunaiva.vault_entities
            WHERE vault_id = %s
            ORDER BY last_seen DESC
            LIMIT 15
        """, (VAULT_ID,))
        entities = cur.fetchall()

        # Active decisions
        cur.execute("""
            SELECT decision, context, importance
            FROM sunaiva.vault_decisions
            WHERE vault_id = %s
            ORDER BY date DESC
            LIMIT 8
        """, (VAULT_ID,))
        decisions = cur.fetchall()

        # Recent conversations (last 3)
        cur.execute("""
            SELECT source_platform, message_count, imported_at
            FROM sunaiva.vault_conversations
            WHERE vault_id = %s
            ORDER BY imported_at DESC
            LIMIT 3
        """, (VAULT_ID,))
        convos = cur.fetchall()

        conn.close()
        return entities, decisions, convos

    except Exception as e:
        print(f"<!-- sunaiva_inject: DB error: {e} -->", file=sys.stderr)
        return [], [], []


def main():
    entities, decisions, convos = query_vault()

    if not entities and not decisions and not convos:
        # Return empty JSON instead of sys.exit(0) — Claude Code expects JSON from hooks
        print(json.dumps({}))
        return

    lines = [
        "## VERIFIED CONTEXT FROM SUNAIVA VAULT (Prior Sessions)",
        "_Genesis cross-session memory — skip re-exploration, trust this context._",
        "",
    ]

    if entities:
        lines.append("### Known Entities & State")
        for name, etype, context in entities:
            if isinstance(context, list):
                ctx = " ".join(str(c) for c in context)[:200]
            else:
                ctx = (context or "")[:200]
            lines.append(f"- **{name}** `{etype}`: {ctx}")
        lines.append("")

    if decisions:
        lines.append("### Active Decisions (Locked)")
        for decision, context, importance in decisions:
            ctx = (context or "").strip()[:150]
            imp = importance or "normal"
            lines.append(f"- **{decision[:100]}** [{imp}]: {ctx}")
        lines.append("")

    if convos:
        lines.append("### Recent Imported Conversations")
        for platform, msg_count, imported_at in convos:
            lines.append(f"- {platform}: {msg_count} messages (imported {str(imported_at)[:10]})")
        lines.append("")

    lines.append("_End of Sunaiva vault context. Skip re-exploration — data is current._")
    # Return with correct hookSpecificOutput wrapper for Claude Code hook protocol
    print(json.dumps({
        "hookSpecificOutput": {
            "hookEventName": "SessionStart",
            "additionalContext": "\n".join(lines)
        }
    }))


if __name__ == "__main__":
    main()
