#!/usr/bin/env python3
"""2026-10-15 run: dormancy (originals-only, RT-filtered), handle diff vs 10-14,
offer/phrase grep, per-handle maxima, core top-10 with URLs."""
import json, os, re
from datetime import datetime, timezone, timedelta

RAW = "/home/kiro/trend-engine/trends/x/raw"
TODAY = "2026-10-15"
PREV = "2026-10-14"

IRRELEVANT = {"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_INDUSTRY = {"DiscussingFilm","nofilmschool"}
TIER2 = {"CuriousRefuge","paultrillo","JeffSynthesized","ai_filmmaker","Magiermogul","JiamingSuen","Chandan_Perla"}

d = json.load(open(f"{RAW}/scan_results_{TODAY}_FULL.json"))
raw = d["raw"]; qual = d["qualifying"]

now = datetime.now(timezone.utc)
cutoff = datetime(2026, 10, 12, tzinfo=timezone.utc)

def dt(s):
    try:
        return datetime.strptime(s, "%a %b %d %H:%M:%S %z %Y")
    except Exception:
        return None

def is_original(t):
    if t.get("retweeted_tweet"):
        return False
    if (t.get("text") or "").startswith("RT @"):
        return False
    return True

print("=== RAW SHAPE ===")
print("handle count raw:", len(raw), "| qualifying:", len(qual), "| failures:", d.get("failures"))

# handle diff
try:
    p = json.load(open(f"{RAW}/scan_results_{PREV}_FULL.json"))
    prev_h = set(p["raw"].keys()); cur_h = set(raw.keys())
    print(f"ADDED vs {PREV}:", sorted(cur_h - prev_h) or "none")
    print(f"REMOVED vs {PREV}:", sorted(prev_h - cur_h) or "none")
    print("prev count:", len(prev_h), "cur count:", len(cur_h))
except Exception as e:
    print("diff failed:", e)

# ---- DORMANCY (originals only) ----
print("\n=== DORMANCY: zeros / low-yield (newest ORIGINAL) ===")
zero = [h for h in raw if not any(q["handle"].lower() == h.lower() for q in qual)]
for h in sorted(zero, key=str.lower):
    tw = raw.get(h, [])
    origs = [t for t in tw if is_original(t)]
    newest = max((dt(t.get("createdAt","")) for t in origs if dt(t.get("createdAt",""))), default=None)
    inwin = [t for t in origs if (dt(t.get("createdAt","")) or cutoff - timedelta(1)) >= cutoff]
    age = f"{(now-newest).days}d" if newest else "NO ORIGINALS"
    newest_txt = newest.strftime("%Y-%m-%d") if newest else "-"
    flag = ""
    if newest and newest < cutoff:
        flag = "OUT-OF-WINDOW"
    elif inwin:
        best_v = max((t.get("viewCount",0) or 0) for t in inwin)
        best_l = max((t.get("likeCount",0) or 0) for t in inwin)
        flag = f"IN-WINDOW orig={len(inwin)} bestL={best_l} bestV={best_v}"
    tier = "IRREL" if h in IRRELEVANT else ("TIER2" if h in TIER2 else "CORE")
    print(f"{h:22s} {tier:6s} newest_orig={newest_txt} ({age}) {flag}")
    if inwin:
        for t in sorted(inwin, key=lambda x: -(x.get("viewCount",0) or 0))[:3]:
            print(f"    -> {(t.get('text') or '')[:90]!r} | {t.get('likeCount')}L/{t.get('retweetCount')}RT/{t.get('viewCount')}V")

# ---- per-handle maxima of qualifying ----
print("\n=== PER-HANDLE MAX (score) ===")
mx = {}
for q in qual:
    h = q["handle"]
    if h not in mx or q["score"] > mx[h]["score"]:
        mx[h] = q
for h, q in sorted(mx.items(), key=lambda kv: -kv[1]["score"]):
    print(f"{q['score']:>8.0f} {h:18s} {q['likes']}L/{q['rt']}RT/{q['views']}V {q['date']} {q['url']}")

# ---- CORE TOP 10 clean ----
print("\n=== CORE TOP 10 (excl IRRELEVANT + FILM_INDUSTRY) ===")
core = [q for q in qual if q["handle"] not in IRRELEVANT and q["handle"] not in FILM_INDUSTRY]
core.sort(key=lambda q: -q["score"])
for i, q in enumerate(core[:10], 1):
    print(f"{i}|@{q['handle']}|{q['likes']}L|{q['rt']}RT|{q['replies']}R|{q['views']}V|{q['date']}|score={q['score']:.0f}")
    print(f"   {(q['text'] or '')[:160]}")
    print(f"   {q['url']}")
print("rank 11 score:", f"{core[10]['score']:.0f}" if len(core) > 10 else "n/a", "| core count:", len(core))

# ---- FILM INDUSTRY AI-relevant ----
AI_TERMS = re.compile(r"\b(ai\b|3d|generated) ?animation|\bai\b|gemini|(?<!\bfilm )(?<!\bfilm-)(?<!\bscreenplay )(?<!\bscreenplay-)\bprompt|generative|midjourney|sora|runway|veo|seedance|kling|stable diffusion|llm|machine learning|neural|diffusion|synthesia|deepfake", re.I)
print("\n=== FILM-INDUSTRY TIER ===")
for q in sorted([q for q in qual if q['handle'] in FILM_INDUSTRY], key=lambda x: -x['score']):
    m = AI_TERMS.search(q['text'] or "")
    if m:
        print(f"AI-MATCH term={m.group(0)!r} @{q['handle']} {q['likes']}L/{q['views']}V {q['url']}")
        print(f"   {(q['text'] or '')[:150]}")
print("film-industry qualifying total:", len([q for q in qual if q['handle'] in FILM_INDUSTRY]))

# ---- OFFER / PROMO GREP ----
OFFERS = {
 "Higgsfield Genjutsu API": r"genjutsu",
 "Higgsfield Wan 3.0 UNLIMITED": r"wan 3\.?0",
 "Higgsfield API discount": r"(api[^.]{0,40}(50|60)%)|((50|60)% ?off[^.]{0,30}api)",
 "Higgsfield cashback": r"cashback",
 "Higgsfield Ads Studio": r"ads studio|ad multiplier",
 "Higgsfield AI Influencer": r"ai influencer",
 "Katana": r"katana",
 "Magnific One": r"magnific",
 "Dreamina Originals": r"dreamina",
 "Dolphin AI referral": r"XX-AYCMR8|dolphin ai",
 "Flova Seedance 80% off": r"seedance",
 "Air free credits": r"unlimited credits|air[^a-z]{1,4}credits",
 "CapCut Black Friday": r"black friday",
 "free credits/giveaway": r"free credits|free access|giveaway|free for",
 "Agent Forge": r"agent forge",
 "GPU credits crypto": r"gpu credits|acn",
 "Gemini 4 Argon": r"argon",
 "Kling 4.0": r"kling 4",
 "film festival": r"film festival|shortlist|audience choice",
}
print("\n=== OFFER / PROMO GREP (qualifying text) ===")
allt = [(q['handle'], (q['text'] or ''), q['url'], q['likes'], q['views']) for q in qual]
for name, pat in OFFERS.items():
    rx = re.compile(pat, re.I)
    hits = [t for t in allt if rx.search(t[1])]
    print(f"{name:28s} hits={len(hits)}")
    for h, txt, url, l, v in sorted(hits, key=lambda x: -x[3])[:4]:
        mm = rx.search(txt)
        print(f"    @{h:16s} {l}L/{v}V  match={mm.group(0)!r}  {url}")
