#!/usr/bin/env python3
import json
import subprocess
import sys
from pathlib import Path
from typing import List, Dict, Any

ACCOUNT = "srvdeskops@gmail.com"
STATE_PATH = Path("/home/isthekid/.openclaw/workspace/memory/email-alert-state.json")
MAX_RESULTS = 10


def run_gog(args: List[str]) -> str:
  p = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
  if p.returncode != 0:
    raise RuntimeError(p.stderr.strip() or f"gog failed: {p.returncode}")
  return p.stdout


def load_state() -> Dict[str, Any]:
  if STATE_PATH.exists():
    try:
      return json.loads(STATE_PATH.read_text())
    except Exception:
      return {}
  return {}


def save_state(state: Dict[str, Any]) -> None:
  STATE_PATH.parent.mkdir(parents=True, exist_ok=True)
  STATE_PATH.write_text(json.dumps(state, indent=2))


def main():
  state = load_state()
  seen = set(state.get("seenIds") or [])

  # Match common variants/typos for the "ToAssistant" trigger.
  # Gmail search supports OR + quoted phrases.
  query = "is:unread in:inbox (subject:\"ToAssistant\" OR subject:\"ToAssitant\" OR subject:\"ToAsssistant\" OR subject:\"ToAsissant\" OR subject:\"To Assist\" OR subject:\"To-Assistant\")"
  out = run_gog([
    "gog", "gmail", "messages", "search",
    query,
    "--max", str(MAX_RESULTS),
    "--account", ACCOUNT,
    "--json",
    "--no-input",
  ])

  data = json.loads(out)
  msgs = data.get("messages") or []

  # Newest-first; we want to alert oldest-first for readability
  new_msgs = [m for m in msgs if m.get("id") and m["id"] not in seen]
  new_msgs.reverse()

  alerts = []
  for m in new_msgs:
    mid = m.get("id")
    if not mid:
      continue

    # Fetch body/snippet so downstream can make decisions (e.g., "boards" keyword).
    # NOTE: In this gog build, "gmail get <messageId>" is the supported command
    # (not "gmail messages get").
    detail_raw = run_gog([
      "gog", "gmail", "get", mid,
      "--account", ACCOUNT,
      "--json",
      "--no-input",
    ])
    detail = json.loads(detail_raw)

    snippet = (detail.get("snippet") or m.get("snippet") or "")
    body = (detail.get("body") or "")

    seen.add(mid)
    alerts.append({
      "id": mid,
      "date": m.get("date") or detail.get("date"),
      "from": m.get("from") or detail.get("from"),
      "subject": m.get("subject") or detail.get("subject"),
      "threadId": m.get("threadId") or detail.get("threadId"),
      "snippet": snippet,
      "body": body,
    })

  # Keep state bounded
  state["seenIds"] = list(seen)[-200:]
  save_state(state)

  sys.stdout.write(json.dumps({"alerts": alerts}, indent=2))


if __name__ == "__main__":
  main()
