#!/usr/bin/env python3
"""Offer grep + outlier verification + handle diff + tier2 + labs, 2026-10-21."""
import json, re
from datetime import datetime, timezone, timedelta

BASE = "/home/kiro/trend-engine/trends/x/raw"
d = json.load(open(f"{BASE}/scan_results_2026-10-21_FULL.json"))
prev = json.load(open(f"{BASE}/scan_results_2026-10-20_FULL.json"))
raw, qual = d["raw"], d["qualifying"]

now = datetime.now(timezone.utc)
cutoff = datetime(now.year, now.month, now.day, tzinfo=timezone.utc) - timedelta(days=3)
def pdt(s): return datetime.strptime(s, "%a %b %d %H:%M:%S %z %Y")

print("===== HANDLE DIFF vs 10-20 =====")
a, b = set(d["handles"]), set(prev["handles"])
print("now:", len(a), "prev:", len(b), "ADDED:", sorted(a-b), "REMOVED:", sorted(b-a))

# ---- offer patterns (OFFER PHRASE, not brand word) ----
PATTERNS = {
 "Genjutsu": r"genjutsu",
 "Genjutsu Lite": r"genjutsu lite",
 "Flova x Seedance": r"(flova[^.]{0,30}seedance|seedance[^.]{0,30}flova|save up to 80)",
 "Wan 3.0 Prime": r"wan ?3\.0 prime",
 "Wan 3.0 UNLIMITED": r"wan ?3\.0[^.]{0,40}unlimited|unlimited[^.]{0,40}wan ?3",
 "Higgsfield API discount": r"(60% off|50%[ -]?off)[^.]{0,40}(api|higgsfield)|higgsfield api[^.]{0,30}(off|discount)",
 "Higgsfield cashback": r"cashback",
 "Ads Studio|Ad Multiplier": r"(ads studio|ad multiplier)",
 "AI Influencer free": r"ai influencer",
 "Higgsfield Academy": r"academy",
 "CapCut Black Friday": r"capcut",
 "Dreamina": r"dreamina",
 "Magnific": r"magnific",
 "Dolphin": r"dolphin",
 "Air unlimited": r"\bair\b[^.]{0,30}unlimited",
 "% off / discount": r"\b\d{1,2}% ?off",
 "free credits|free generations": r"(free (credits|generations|trial|tier)|up to \d+ (free|generations))",
 "filmera": r"filmera",
 "freebeat": r"freebeat",
 "DaVinci Resolve": r"davinci resolve",
 "Nebius grant": r"(nebius|compute grant)",
 "MCP": r"\bmcp\b",
 "seedance 2.5": r"seedance ?2\.5",
 "kling 4.0": r"kling ?4\.0",
 "flux 3": r"flux ?3",
 "opus 5.5": r"opus ?5\.5",
 "deepseek v4.1": r"deepseek[ -]?v?4\.1",
 "minimax": r"minimax",
 "gemini 4": r"gemini ?4",
}
print("\n===== OFFER / TOPIC GREP (in-window only) =====")
for name, pat in PATTERNS.items():
    rgx = re.compile(pat, re.I)
    hits = []
    for h, items in raw.items():
        for it in items:
            if pdt(it["createdAt"]) < cutoff: continue
            if rgx.search(it.get("text") or ""):
                hits.append((h, it))
    if not hits:
        print(f"\n## {name}: 0 hits in-window")
        continue
    hits.sort(key=lambda x: -(x[1].get("viewCount") or 0))
    print(f"\n## {name}: {len(hits)} hits in-window")
    for h, it in hits[:5]:
        print(f"  @{h} {it.get('likeCount')}L/{it.get('viewCount')}V {it['createdAt']}")
        print(f"    {re.sub(chr(10),' ', (it.get('text') or ''))[:280]}")
        print(f"    https://x.com/{h}/status/{it.get('id')}")

# ---- outlier verification on core top 3 ----
print("\n===== OUTLIER VERIFY (core top 3) =====")
IRR = {"AIBuzzNews","AIGuideHQ","AITECHio","AIFrontliner","TheAIColony","AITOPIAai","AISuperDomain",
 "GoogleLabs","GoogleAI","DonutAI","cladlabs","FaithJaiye2187","KammelaBala","MyStageAI","AlexStudio44",
 "AI_with_jasmin","Ai_Vaidehi","ChrisLaubAI","OpenAI","AnthropicAI","CINEMA505","AIScottAdams",
 "AI_Jasonyu","AIByLeo"}
FILM = {"DiscussingFilm","nofilmschool"}
core = sorted([q for q in qual if q["handle"] not in IRR and q["handle"] not in FILM], key=lambda x:-x["score"])
for q in core[:3]:
    h = q["handle"]
    rec = next((r for r in raw[h] if r.get("id") == q.get("id") or (r.get("text") == q.get("text"))), None)
    if not rec:
        print(f"@{h} rank: record NOT FOUND"); continue
    author = (rec.get("author") or {}).get("userName")
    media = rec.get("media")
    mtype = media[0].get("type") if isinstance(media, list) and media else None
    baseline = max([r.get("likeCount") or 0 for r in raw[h] if r is not rec] + [0])
    print(f"@{h} {q['likes']}L author={author} rt={'yes' if rec.get('retweeted_tweet') else 'no'} "
          f"quote={'yes' if rec.get('quoted_tweet') else 'no'} media={mtype} baseline_max={baseline} "
          f"ratio={(q['likes'] or 1)/max(baseline,1):.1f}x")

# ---- tier-2 ----
print("\n===== TIER-2 =====")
T2 = ["CuriousRefuge","paultrillo","CorridorDigital","JeffSynthesized","ai_filmmaker","visiblemaker",
      "Magiermogul","JiamingSuen","moonvalley","Chandan_Perla"]
for h in T2:
    n = sum(1 for q in qual if q["handle"] == h)
    items = raw.get(h, [])
    origs = [i for i in items if not i.get("retweeted_tweet")]
    inw = [i for i in origs if pdt(i["createdAt"]) >= cutoff]
    newest = max([pdt(i["createdAt"]) for i in origs], default=None)
    print(f"@{h:18s} qual={n:2d} inwin_orig={len(inw):2d} newest_orig={newest.strftime('%Y-%m-%d') if newest else 'NA'}")

# ---- labs composition ----
print("\n===== LABS =====")
for q in sorted([q for q in qual if q["handle"] in {"OpenAI","AnthropicAI"}], key=lambda x:-x["score"]):
    print(f"@{q['handle']} {q['likes']}L/{q['views']}V {q['date']}")
    print(f"  {q['text'][:200]}")
