#!/usr/bin/env python3 -u
"""
Aria Chat Logger - SQLite
Liest tmux Session und speichert Nachrichten in SQLite.
"""
import os, re, time, json, hashlib, sqlite3, subprocess
from datetime import datetime, timezone

DB_PATH = os.path.expanduser("~/.aria-chat.db")
TMUX_SESSION = "aria"
POLL_INTERVAL = 30
BUFFER_LINES = 2000
RETENTION_DAYS = 7

seen_hashes: set = set()

RE_INBOUND_XML = re.compile(
    r'<channel\s+source="telegram"\s+'
    r'chat_id="(?P<chat_id>[^"]{1,50})"\s+'
    r'message_id="(?P<message_id>[^"]{1,50})"\s+'
    r'user="(?P<user>[^"]{1,100})"\s+'
    r'ts="(?P<ts>[^"]{1,50})"'
    r'[^>]{0,200}>'
    r'(?P<text>.{0,5000}?)</channel>',
    re.DOTALL
)
RE_OUTBOUND = re.compile(
    r'mcp__plugin_telegram_telegram__reply.*?"text":\s*"(?P<text>.{1,3000}?)"',
    re.DOTALL
)

def init_db():
    conn = sqlite3.connect(DB_PATH)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS aria_chat_log (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            created_at TEXT NOT NULL DEFAULT (datetime('now')),
            direction TEXT NOT NULL,
            chat_id TEXT NOT NULL,
            user_name TEXT,
            message_text TEXT,
            source TEXT DEFAULT 'telegram',
            metadata TEXT
        )
    """)
    conn.execute("CREATE INDEX IF NOT EXISTS idx_created_at ON aria_chat_log(created_at)")
    conn.commit()
    conn.close()
    os.chmod(DB_PATH, 0o600)

def get_tmux_buffer():
    try:
        r = subprocess.run(
            ["tmux", "capture-pane", "-t", TMUX_SESSION, "-p", "-S", f"-{BUFFER_LINES}"],
            capture_output=True, text=True, timeout=5
        )
        return r.stdout if r.returncode == 0 else ""
    except:
        return ""

def save(direction, chat_id, user_name, text):
    h = hashlib.md5(f"{direction}{chat_id}{text[:200]}".encode()).hexdigest()
    if h in seen_hashes:
        return
    seen_hashes.add(h)
    if len(seen_hashes) > 5000:
        seen_hashes.clear()
    conn = sqlite3.connect(DB_PATH)
    conn.execute(
        "INSERT INTO aria_chat_log (direction, chat_id, user_name, message_text) VALUES (?,?,?,?)",
        (direction, chat_id, user_name, text[:4000])
    )
    conn.commit()
    conn.close()

def cleanup():
    conn = sqlite3.connect(DB_PATH)
    conn.execute(f"DELETE FROM aria_chat_log WHERE created_at < datetime('now', '-{RETENTION_DAYS} days')")
    conn.commit()
    conn.close()

def process(buf):
    for m in RE_INBOUND_XML.finditer(buf):
        save("in", m.group("chat_id"), m.group("user"), m.group("text").strip())
    for m in RE_OUTBOUND.finditer(buf):
        text = m.group("text").replace("\\n", "\n").replace('\\"', '"')
        save("out", "telegram", "Aria", text[:4000])

init_db()
cleanup_counter = 0
while True:
    buf = get_tmux_buffer()
    if buf:
        process(buf)
    cleanup_counter += 1
    if cleanup_counter >= 20:
        cleanup()
        cleanup_counter = 0
    time.sleep(POLL_INTERVAL)
