#!/usr/bin/env python3
"""New-since-yesterday diff + full core dump + like-rate leaderboard for 2026-11-04."""
import json
from datetime import datetime, timezone, timedelta

RAW = "/home/kiro/trend-engine/trends/x/raw"
d = json.load(open(f"{RAW}/scan_results_2026-11-04_FULL.json"))
p = json.load(open(f"{RAW}/scan_results_2026-11-03_FULL.json"))
NOW = datetime.now(timezone.utc)
CUT = NOW.replace(hour=0,minute=0,second=0,microsecond=0) - timedelta(days=3)

def pd(s):
    try: return datetime.strptime(s, "%a %b %d %H:%M:%S %z %Y")
    except Exception: return None
def is_orig(t):
    return not (t.get("retweeted_tweet") or t.get("type")=="retweet" or (t.get("text") or "").startswith("RT @"))
def score(t): return ((t.get('likeCount') or 0)+2*(t.get('retweetCount') or 0)+3*(t.get('replyCount') or 0)+(t.get('viewCount') or 0)/100)

IRR = {"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","DiscussingFilm","nofilmschool","interesting_aIl","hubermanlab","NVIDIAAI"}

def ids(js, only_core=True):
    s=set()
    for h,tw in js["raw"].items():
        if only_core and h in IRR: continue
        for t in tw:
            if is_orig(t) and t.get("id"): s.add(str(t["id"]))
    return s
new_ids = ids(d) - ids(p)
print(f"===== NEW CORE ORIGINALS SINCE 11-03 SNAPSHOT: {len(new_ids)} =====")
rows=[]
for h,tw in d["raw"].items():
    if h in IRR: continue
    for t in tw:
        if str(t.get("id")) in new_ids:
            dt=pd(t.get("createdAt",""))
            rows.append((score(t),h,dt,t))
for s,h,dt,t in sorted(rows, reverse=True)[:20]:
    print(f"  scr={s:7.0f}|@{h}|{dt.strftime('%m-%d %H:%M') if dt else '?'}|{t.get('likeCount')}L|{t.get('viewCount')}V|{(t.get('text') or '').replace(chr(10),' ')[:120]}")

print("\n===== LIKE-RATE LEADERBOARD (core, in-window, likes>=50) =====")
lb=[]
for h,tw in d["raw"].items():
    if h in IRR: continue
    for t in tw:
        dt=pd(t.get("createdAt",""))
        if not dt or dt<CUT or not is_orig(t): continue
        v=t.get("viewCount") or 0; l=t.get("likeCount") or 0
        if v<500 or l<50: continue
        lb.append((l/v*100, l, v, h, dt, (t.get("text") or "").replace("\n"," ")[:100], t.get("id")))
for lr,l,v,h,dt,txt,tid in sorted(lb, reverse=True)[:15]:
    print(f"  {lr:5.2f}%|{l}L|{v}V|@{h}|{dt.strftime('%m-%d %H:%M')}|{txt}")
    print(f"        https://x.com/{h}/status/{tid}")

print("\n===== ALL 75 CORE POSTS (score desc) =====")
core=[]
for h,tw in d["raw"].items():
    if h in IRR: continue
    for t in tw:
        dt=pd(t.get("createdAt",""))
        if not dt or dt<CUT or not is_orig(t): continue
        if not ((t.get("likeCount") or 0)>=50 or (t.get("retweetCount") or 0)>=10 or (t.get("viewCount") or 0)>=1000): continue
        core.append((score(t),h,dt,t))
print(f"  total {len(core)}")
for s,h,dt,t in sorted(core, reverse=True):
    v=t.get("viewCount") or 0; l=t.get("likeCount") or 0
    lr=(l/v*100) if v else 0
    print(f"  {s:7.0f}|{lr:5.2f}%|@{h:16s}|{dt.strftime('%m-%d %H:%M')}|{l}L|{v}V|{(t.get('text') or '').replace(chr(10),' ')[:110]}")
