#!/usr/bin/env python3
"""Long-span OMemAI recall regression.

Purpose:
- Run this after a delay (hours/day) with an Agent API key and known project id.
- It verifies exact search, context recall, and memory_results recall for phrases.

Usage:
  OMEMAI_API_KEY=omem_live_... \
  OMEMAI_PROJECT_ID=<uuid> \
  OMEMAI_EXPECT_FACTS='苍穹锚点,深海信标' \
  python3 long-recall-regression.py
"""
from __future__ import annotations

import json
import os
import sys
import urllib.request

API_BASE = os.environ.get("OMEMAI_API_BASE", "https://omemai.com").rstrip("/") + "/api"
API_KEY = os.environ.get("OMEMAI_API_KEY", "").strip()
PROJECT_ID = os.environ.get("OMEMAI_PROJECT_ID", "").strip()
FACTS = [x.strip() for x in os.environ.get("OMEMAI_EXPECT_FACTS", "").split(",") if x.strip()]


def request(method: str, path: str, body: dict | None = None) -> object:
    if not API_KEY:
        raise SystemExit("OMEMAI_API_KEY is required")
    data = json.dumps(body, ensure_ascii=False).encode() if body is not None else None
    req = urllib.request.Request(
        API_BASE + path,
        data=data,
        method=method,
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
            "X-OMemAI-Client": "long-recall-regression",
        },
    )
    with urllib.request.urlopen(req, timeout=30) as resp:
        text = resp.read().decode()
        return json.loads(text) if text else None


def main() -> int:
    if not PROJECT_ID:
        raise SystemExit("OMEMAI_PROJECT_ID is required")
    if not FACTS:
        raise SystemExit("OMEMAI_EXPECT_FACTS is required, comma-separated")
    context = request("GET", f"/agent/projects/{PROJECT_ID}/context")
    context_text = json.dumps(context, ensure_ascii=False)
    results = {}
    ok = True
    for fact in FACTS:
        search = request("POST", "/agent/memory/search", {"project_id": PROJECT_ID, "query": fact, "scope": "current_project", "limit": 10})
        search_text = json.dumps(search, ensure_ascii=False)
        row = {
            "search_hits": len(search or []),
            "search_has_fact": fact in search_text,
            "context_has_fact": fact in context_text,
            "exact_hits": sum(1 for item in (search or []) if isinstance(item, dict) and item.get("exact_match")),
            "current_hits": sum(1 for item in (search or []) if isinstance(item, dict) and item.get("fact_status") == "current"),
            "superseded_hits": sum(1 for item in (search or []) if isinstance(item, dict) and item.get("fact_status") == "superseded"),
        }
        results[fact] = row
        if not (row["search_has_fact"] and row["context_has_fact"]):
            ok = False
    print(json.dumps({"ok": ok, "project_id": PROJECT_ID, "facts": results}, ensure_ascii=False, indent=2))
    return 0 if ok else 1


if __name__ == "__main__":
    raise SystemExit(main())
