#!/usr/bin/env python3
"""Fetch-window, dormancy, tier-2, arrival, bucket sizes for 2026-10-20 run."""
import json, sys
from datetime import datetime, timedelta, timezone

D = json.load(open("/home/kiro/trend-engine/trends/x/raw/scan_results_2026-10-20_FULL.json"))
raw = D["raw"]; qual = D["qualifying"]
print("top keys:", list(D.keys()))
print("raw handles:", len(raw), "| qualifying:", len(qual), "| failures:", repr(D.get("failures")))

FMT = "%a %b %d %H:%M:%S %z %Y"
def dt(s):
    return datetime.strptime(s, FMT)

now = datetime.now(timezone.utc)
cutoff = datetime(now.year, now.month, now.day, tzinfo=timezone.utc) - timedelta(days=3)
print("CUTOFF", cutoff.isoformat())

# qualifying per handle
qc = {}
for q in qual:
    qc[q["handle"]] = qc.get(q["handle"], 0) + 1

print("\n=== FETCH WINDOW PER HANDLE (parsed datetimes) ===")
rows = []
for h, tweets in raw.items():
    if not tweets: continue
    ds = [dt(t["createdAt"]) for t in tweets]
    mn, mx = min(ds), max(ds)
    n_in = sum(1 for d in ds if d >= cutoff)
    rows.append((h, len(tweets), mn, mx, n_in, qc.get(h, 0)))
rows.sort(key=lambda r: r[3], reverse=True)
stale = []
for h, n, mn, mx, n_in, q in rows:
    age = (now - mx).total_seconds() / 3600
    flag = "STALE" if age > 12 else ""
    if flag: stale.append((h, age))
    print(f"{h:22s} n={n:2d} min={mn.strftime('%Y-%m-%d %H:%M')} max={mx.strftime('%Y-%m-%d %H:%M')} age={age:6.1f}h inwin={n_in:2d} qual={q:2d} {flag}")
print("\nSTALE (>12h newest):", ", ".join(f"{h}({a:.0f}h)" for h, a in stale) or "none")

# dormancy: originals only
print("\n=== DORMANCY: ORIGINALS ONLY (RT filtered) ===")
zero_handles = set(raw) - set(qc)
for h in sorted(raw):
    tweets = raw[h]
    origs = [t for t in tweets if t.get("retweeted_tweet") is None and not t.get("text","").startswith("RT @")]
    if not origs: 
        print(f"{h:22s} NO ORIGINALS in fetched set (n={len(tweets)})")
        continue
    ods = [dt(t["createdAt"]) for t in origs]
    newest = max(ods)
    inwin = [t for t in origs if dt(t["createdAt"]) >= cutoff]
    if h in zero_handles:
        best = max((t.get("likeCount",0) for t in inwin), default=0)
        bestv = max((t.get("viewCount",0) for t in inwin), default=0)
        print(f"{h:22s} ZERO-QUAL | originals={len(origs)} newest_orig={newest.strftime('%Y-%m-%d %H:%M')} ({(now-newest).days}d) inwin_orig={len(inwin)} bestL={best} bestV={bestv}")

print("\n=== TIER-2 (10) ===")
T2 = ["CuriousRefuge","paultrillo","CorridorDigital","JeffSynthesized","ai_filmmaker","visiblemaker","Magiermogul","JiamingSuen","moonvalley","Chandan_Perla"]
silent = []
for h in T2:
    c = qc.get(h, 0)
    print(f"{h:18s} qual={c}")
    if c == 0: silent.append(h)
print(f"silent {len(silent)}/{len(T2)}: {silent}")

print("\n=== CORE TOP 10 (arrival check) ===")
CORE = set(json.load(open("/tmp/core_tmp.json"))) if False else None
for i, q in enumerate(qual[:6], 1):
    print(i, q["handle"], q["score"])

print("\n=== AI LABS ===")
LAB = {"OpenAI","AnthropicAI"}
for q in qual:
    if q["handle"] in LAB:
        print(f"{q['handle']:12s} {q['likes']}L/{q['views']}V {q['date']} | {q['text'][:150]}")
