#!/usr/bin/env python3
"""
Radar Thread Poster
Runs personal-radar, creates a new thread in #radar, posts results there.
Usage: python3 radar-thread-post.py
"""

import json
import subprocess
import sys
import os
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

WORKSPACE = "/root/.openclaw/workspace"
def _load_kitt_token():
    import json as _json
    with open("/root/.openclaw/openclaw.json") as f:
        d = _json.load(f)
    return d["channels"]["discord"]["accounts"]["kitt"]["token"]

KITT_TOKEN = _load_kitt_token()
RADAR_CHANNEL_ID = "1467975831958716466"
LISBON = ZoneInfo("Europe/Lisbon")


# ── Discord helpers ────────────────────────────────────────────────────────────

def discord(method, path, data=None, token=KITT_TOKEN):
    cmd = [
        "curl", "-s", "-X", method,
        f"https://discord.com/api/v10{path}",
        "-H", f"Authorization: Bot {token}",
        "-H", "Content-Type: application/json",
    ]
    if data:
        cmd += ["-d", json.dumps(data)]
    r = subprocess.run(cmd, capture_output=True, text=True)
    try:
        return json.loads(r.stdout) if r.stdout else {}
    except Exception:
        return {}


def create_thread(channel_id, name):
    return discord("POST", f"/channels/{channel_id}/threads", {
        "name": name[:100],
        "auto_archive_duration": 1440,
        "type": 11,  # PUBLIC_THREAD
    })


def post_chunk(thread_id, content):
    """Post content, splitting at newlines if > 2000 chars."""
    content = content.strip()
    while len(content) > 2000:
        split = content[:2000].rfind("\n")
        if split == -1:
            split = 1990
        discord("POST", f"/channels/{thread_id}/messages", {"content": content[:split]})
        content = content[split:].lstrip("\n")
    if content:
        discord("POST", f"/channels/{thread_id}/messages", {"content": content})


# ── Formatter ─────────────────────────────────────────────────────────────────

def fmt(data: dict) -> str:
    now = datetime.now(LISBON)
    today = now.date()
    tomorrow = today + timedelta(days=1)

    lines = [f"🔭 **Personal Radar** — {now.strftime('%a %d %b %Y, %H:%M Lisbon')}", ""]

    # ── Email ──────────────────────────────────────────────────────────────────
    accounts = data.get("google_accounts", [])
    total_unread = sum(a["gmail"]["unread_count"] for a in accounts if "gmail" in a)
    lines.append(f"📧 **Email** ({total_unread} unread across {len(accounts)} accounts)")

    for acct in accounts:
        gmail = acct.get("gmail", {})
        if not gmail:
            continue
        lines.append(f"\n**{acct['label']}** ({gmail.get('unread_count', 0)} unread)")
        for msg in gmail.get("messages", [])[:8]:
            sender = msg["from"].split("<")[0].strip().strip('"')
            lines.append(f"- **{sender}** — {msg['subject']}")

    lines.append("\n---")

    # ── Calendar ──────────────────────────────────────────────────────────────
    all_events = []
    for acct in accounts:
        all_events.extend(acct.get("calendar", {}).get("events", []))

    def parse_event_time(ev):
        start = ev.get("start", "")
        if "T" in start:
            return datetime.fromisoformat(start).astimezone(LISBON)
        return None

    def dedup(events):
        seen, out = set(), []
        for ev in events:
            if ev["summary"] not in seen:
                seen.add(ev["summary"])
                out.append(ev)
        return out

    today_events = dedup([
        ev for ev in all_events
        if str(today) in ev.get("start", "")
    ])
    tomorrow_events = dedup([
        ev for ev in all_events
        if str(tomorrow) in ev.get("start", "")
    ])

    lines.append(f"📅 **Today** — {now.strftime('%A %d %b')}")
    if today_events:
        for ev in sorted(today_events, key=lambda e: e.get("start", "")):
            t = parse_event_time(ev)
            prefix = t.strftime("%H:%M") if t else "All day"
            lines.append(f"- {prefix} — {ev['summary']}")
    else:
        lines.append("- Nothing scheduled")

    if tomorrow_events:
        lines.append(f"\n📅 **Tomorrow** — {(now + timedelta(days=1)).strftime('%A %d %b')}")
        for ev in sorted(tomorrow_events[:4], key=lambda e: e.get("start", "")):
            t = parse_event_time(ev)
            prefix = t.strftime("%H:%M") if t else "All day"
            lines.append(f"- {prefix} — {ev['summary']}")

    lines.append("\n---")

    # ── Services ──────────────────────────────────────────────────────────────
    services = data.get("services", [])
    ok   = [s["name"] for s in services if s["status"] == "✅"]
    warn = [s["name"] for s in services if s["status"] == "⚠️"]
    fail = [s["name"] for s in services if s["status"] == "❌"]

    lines.append("🔧 **Services**")
    if ok:   lines.append("✅ " + " | ".join(ok))
    if warn: lines.append("⚠️ " + " | ".join(warn))
    if fail: lines.append("❌ " + " | ".join(fail))

    # ── Background ────────────────────────────────────────────────────────────
    bg = data.get("background", {})
    ports = bg.get("ports", [])
    screen = bg.get("screen_sessions", [])

    lines.append("\n🛠️ **Background Services**")
    for p in ports:
        lines.append(f"{p['status']} Port {p['port']} ({p['name']})")
    if screen:
        for s in screen:
            lines.append(f"🖥️ screen: {s}")
    else:
        lines.append("— No active screen sessions")

    return "\n".join(lines)


# ── Main ──────────────────────────────────────────────────────────────────────

def main():
    venv_python = f"{WORKSPACE}/venv/bin/python3"
    radar_script = f"{WORKSPACE}/skills/personal-radar/scripts/radar.py"

    print("Running radar.py...", flush=True)
    result = subprocess.run(
        [venv_python, radar_script],
        capture_output=True, text=True,
        cwd=WORKSPACE,
    )

    if result.returncode != 0:
        print(f"Radar failed:\n{result.stderr}", file=sys.stderr)
        sys.exit(1)

    data = json.loads(result.stdout)

    # Thread name
    now = datetime.now(LISBON)
    thread_name = f"🔭 Radar — {now.strftime('%a %d %b %Y, %H:%M')}"

    # Create thread
    thread = create_thread(RADAR_CHANNEL_ID, thread_name)
    thread_id = thread.get("id")
    if not thread_id:
        print(f"Thread creation failed: {thread}", file=sys.stderr)
        sys.exit(1)

    print(f"Thread created: {thread_name} (id={thread_id})", flush=True)

    # Format and post
    content = fmt(data)
    post_chunk(thread_id, content)
    print("✅ Radar posted to thread.", flush=True)


if __name__ == "__main__":
    main()
