#!/usr/bin/env python3
import json, re
from datetime import datetime, timezone

D = "2026-11-08"
RAW = "/home/kiro/trend-engine/trends/x/raw/"
d = json.load(open(RAW + f"scan_results_{D}_FULL.json"))
raw = d["raw"]; qual = d["qualifying"]; fails = d.get("failures", [])
print("handles:", len(raw), "qualifying:", len(qual), "failures:", fails)

def sets_from(path):
    src = open(path).read()
    out = {}
    for name in ["CORE","IRRELEVANT","FILM_INDUSTRY","NON_CORE","DEAD","OFFTOPIC","HEALTH","LABS"]:
        m = re.search(name + r"\s*=\s*[\[\{]([^\]\}]*)", src)
        if m:
            out[name] = set(re.findall(r'"([^"]+)"', m.group(1))) | set(re.findall(r"'([^']+)'", m.group(1)))
    return out
R = sets_from("/home/kiro/.hermes/scripts/x-account-monitor-run.py")
A = sets_from("/home/kiro/.hermes/scripts/x-account-monitor-analyze.py")
for k in sorted(set(R)|set(A)):
    print(f"{k}: run={len(R.get(k,[]))} analyze={len(A.get(k,[]))}")

CORE = R.get("CORE", set())
IRR = R.get("IRRELEVANT", set())
FILM = R.get("FILM_INDUSTRY", set())
LABS = A.get("LABS", set()) or {"OpenAI","AnthropicAI","NVIDIAAI"}
OFF = A.get("OFFTOPIC", set()) or {"interesting_aIl","CINEMA505"}
HEALTH = A.get("HEALTH", set()) or {"hubermanlab"}
print("LABS:", LABS, "OFF:", OFF, "HEALTH:", HEALTH)

def sc(q): return q["likes"] + q["rt"]*2 + q["replies"]*3 + q["views"]/100
def rate(q): return q["likes"]/max(q["views"],1)*100

seen = {}
for q in qual: seen.setdefault(q["handle"], []).append(q)

buckets = {"core":[], "film":[], "irr":[], "labs":[], "off":[], "health":[], "unclass":[]}
for q in qual:
    h = q["handle"]
    if h in FILM: buckets["film"].append(q)
    elif h in LABS: buckets["labs"].append(q)
    elif h in OFF: buckets["off"].append(q)
    elif h in HEALTH: buckets["health"].append(q)
    elif h in IRR: buckets["irr"].append(q)
    elif h in CORE: buckets["core"].append(q)
    else: buckets["unclass"].append(q)
print("\nBUCKETS:", {k: len(v) for k,v in buckets.items()}, "sum", sum(len(v) for v in buckets.values()), "of", len(qual))

print("\n=== UNCLASSIFIED ===")
for h,lst in sorted(seen.items(), key=lambda kv:-max(sc(x) for x in kv[1])):
    if h in CORE|IRR|FILM|LABS|OFF|HEALTH: continue
    b=max(lst,key=sc)
    print(f"{h} n={len(lst)} best={sc(b):.0f} {b['likes']}L/{b['views']}V rate={rate(b):.2f}% | {b['date']} | {b['text'][:100]}")

print("\n=== RAW CORE TOP 14 ===")
cs = sorted(buckets["core"], key=sc, reverse=True)
for i,q in enumerate(cs[:14],1):
    print(f"{i}|{q['handle']}|{q['likes']}L|{q['rt']}RT|{q['replies']}R|{q['views']}V|{q['date']}|{sc(q):.0f}|rate={rate(q):.3f}%|{q['text'][:100]}")
print("cutoff10:", f"{sc(cs[9]):.0f}", "rank11:", f"{sc(cs[10]):.0f}", "rank12:", f"{sc(cs[11]):.0f}")

paid = [q for q in cs if rate(q) < 0.25 and q['views'] >= 15000]
print("\nPAID-REACH CORE POSTS (rate<0.25%, views>=15k):", len(paid), "of", len(cs))
for q in paid: print(f"  {q['handle']} {q['likes']}L/{q['views']}V rate={rate(q):.3f}% | {q['text'][:80]}")

print("\n=== FRESHNESS (top 30 by n) ===")
def pdt(s): return datetime.strptime(s, "%a %b %d %H:%M:%S %z %Y")
now = datetime.now(timezone.utc)
rows=[]
for h,tw in raw.items():
    ts=[pdt(t["createdAt"]) for t in tw if t.get("createdAt")]
    if not ts: continue
    inwin = sum(1 for t in ts if (now-t).total_seconds() < 3*86400)
    rows.append((h,len(tw),(now-max(ts)).total_seconds()/3600,inwin,len(seen.get(h,[]))))
for h,n,f,iw,nq in sorted(rows,key=lambda r:-r[1])[:30]:
    print(f"{h:22s} n={n:2d} fresh={f:6.1f}h inwin={iw:2d} qual={nq}")
print("\n=== STALEST 10 ===")
for h,n,f,iw,nq in sorted(rows,key=lambda r:-r[2])[:10]:
    print(f"{h:22s} n={n:2d} fresh={f:8.1f}h inwin={iw} qual={nq}")

print("\n=== TIER-2 / ARTEFACT CHECK (originals only, RT filtered) ===")
for h in ["CuriousRefuge","paultrillo","CorridorDigital","JeffSynthesized","ai_filmmaker","visiblemaker","Magiermogul","JiamingSuen","moonvalley","Chandan_Perla","WuxiaRocks","AI__TSUBAKI","karenxcheng","ItsMaryamAi","Nevermined_ai"]:
    tw = raw.get(h) or []
    orig = [t for t in tw if not t.get("retweeted_tweet") and t.get("type")=="tweet"]
    if not orig:
        print(f"{h}: no data"); continue
    newest = max(pdt(t["createdAt"]) for t in orig)
    inw = [t for t in orig if (now-pdt(t["createdAt"])).total_seconds() < 3*86400]
    best = max((t["likeCount"] for t in inw), default=0)
    hh = (now-newest).total_seconds()/3600
    verdict = "DORMANT" if hh > 72 else ("artefact" if inw and best < 50 else "ok")
    print(f"{h:18s} newest_orig={hh:7.1f}h inwin_orig={len(inw):2d} best_likes={best:5d} -> {verdict}")

print("\n=== ZERO-QUALIFYING HANDLES ===")
zq = [h for h in raw if h not in seen]
print(len(zq), "of", len(raw), ":", ", ".join(sorted(zq)))
