#!/usr/bin/env python3
"""Signals sweep for 2026-11-05: CapCut BF status, model launches, pricing, trend, core top-10."""
import json, os, re, glob
from datetime import datetime, timezone, timedelta

RAW = "/home/kiro/trend-engine/trends/x/raw"
cur = json.load(open(os.path.join(RAW, "scan_results_2026-11-05_FULL.json")))
now = datetime.now(timezone.utc)
cutoff = now.replace(hour=0,minute=0,second=0,microsecond=0) - timedelta(days=3)

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

def score(q): return q["likes"]+2*q["rt"]+3*q["replies"]+q["views"]/100
def lr(q): return (q["likes"]/q["views"]*100) if q["views"] else 0

IRRELEVANT={"AIBuzzNews","AIGuideHQ","AITECHio","AIFrontliner","TheAIColony","AITOPIAai","GoogleLabs",
"GoogleAI","DonutAI","cladlabs","FaithJaiye2187","KammelaBala","MyStageAI","AlexStudio44","AI_with_jasmin",
"Ai_Vaidehi","ChrisLaubAI","CINEMA505","OpenAI","AnthropicAI","AIScottAdams","AISuperDomain","AI_Jasonyu",
"AIByLeo","Soaima_Ai","different_ai","via_ai_","Teamily_AI","AIsaOneHQ","AiWithTariq","numerai"}
NON_CORE={"interesting_aIl","hubermanlab","NVIDIAAI"}
FILM={"DiscussingFilm","nofilmschool"}
core=[x for x in cur["qualifying"] if x["handle"] not in IRRELEVANT|NON_CORE|FILM]
core.sort(key=score, reverse=True)
print("=== CORE TOP 10 (report rows) ===")
for i,x in enumerate(core[:10],1):
    print(f"{i}. @{x['handle']} | {x['likes']}L {x['views']}V | {lr(x):.2f}% | {x['date']}")
    print(f"   {x['text'][:150]}")
    print(f"   {x['url']}")

print("\n=== TREND (qualifying totals, last 14 snapshots) ===")
rows=[]
for f in sorted(glob.glob(os.path.join(RAW,"scan_results_*_FULL.json")))[-14:]:
    try:
        d=json.load(open(f))
        rows.append((d.get("date"), len(d.get("qualifying",[])), len(d.get("handles",[]))))
    except Exception: pass
for d,q,h in rows: print(f"  {d}: {q:4d} qualifying / {h} handles")

print("\n=== KEYWORD SWEEP (in-window originals) ===")
KW = {
 "capcut": r"capcut",
 "black friday": r"black\s*friday",
 "seedance": r"seedance",
 "viggle": r"viggle",
 "sora/veo": r"sora|\bveo\b",
 "nano banana": r"nano\s*banana",
 "genjutsu": r"genjutsu",
 "davinci/resolve": r"davinci|resolve",
 "topaz": r"topaz",
 "magnific": r"magnific",
 "runway": r"runway",
 "kling": r"kling",
 "higgsfield": r"higgsfield",
 "gpt image": r"gpt[\s-]*image|images?\s*2\.6",
 "mcp": r"\bmcp\b",
 "open weights": r"open[\s-]weight|open[\s-]source",
 "glif": r"glif",
 "flova": r"flova",
 "pika": r"pika",
 "chroma": r"chroma",
}
comp={k:re.compile(v,re.I) for k,v in KW.items()}
counts={k:[] for k in KW}
for h,tw in cur["raw"].items():
    for t in tw:
        if t.get("retweeted_tweet") or t.get("type")=="retweet": continue
        txt=t.get("text") or ""
        if txt.startswith("RT @"): continue
        d=pdate(t.get("createdAt",""))
        if not d or d<cutoff: continue
        for k,rx in comp.items():
            if rx.search(txt):
                counts[k].append((t.get("likeCount",0),t.get("viewCount",0),h,d,txt))
for k in KW:
    v=sorted(counts[k],key=lambda r:r[1],reverse=True)
    print(f"  {k:14s} {len(v):3d} hits  top: " + ("; ".join(f"@{h} {l}L/{vw}V {d.strftime('%m-%d')}" for l,vw,h,d,_ in v[:3]) if v else "-"))

print("\n=== CAPCUT / BLACK FRIDAY DETAIL ===")
for l,vw,h,d,txt in sorted(counts["capcut"]+counts["black friday"],key=lambda r:r[3]):
    print(f"  @{h} {d.strftime('%m-%d %H:%M')} {l}L/{vw}V: {txt.replace(chr(10),' ')[:260]}")

print("\n=== GPT IMAGE 2.6 / OPENAI IMAGES DETAIL ===")
for l,vw,h,d,txt in sorted(counts["gpt image"],key=lambda r:r[1],reverse=True)[:10]:
    print(f"  @{h} {d.strftime('%m-%d %H:%M')} {l}L/{vw}V: {txt.replace(chr(10),' ')[:300]}")
