#!/usr/bin/env python3
import os, re, json, time, sys
from datetime import datetime, timezone, timedelta
import requests

env_path = os.path.expanduser("~/.hermes/.env")
API_KEY = None
with open(env_path) as f:
    for line in f:
        if line.startswith("GETXAPI_KEY="):
            API_KEY = line.strip().split("=", 1)[1]
            break

watchlist_path = "/home/kiro/trend-engine/trends/x/raw/rising-accounts.md"
text = open(watchlist_path).read()

# SKIP_WORDS for noise (do NOT include nofilmschool or curiousrefuge)
SKIP_WORDS = {
    'x','youtube','facebook','marketingbrew','besttwitteraccounts','theankler','xo2',
    'pixflow','blogs','nvidia','etcjournal','letsdatascience','www'
}

# Extract @handles
handles_raw = re.findall(r'@(\w+)', text)
seen = set()
handles = []
for h in handles_raw:
    h = h.lower()
    if h in SKIP_WORDS:
        continue
    if h in seen:
        continue
    seen.add(h)
    handles.append(h)

print(f"Extracted {len(handles)} handles")

# Ensure core handles present
CORE = ['runwayml','curiousrefuge','nofilmschool','venturetwins','kling_ai','paultrillo',
        'c_valenzuelab','corridordigital','karenxcheng','higgsfield','pika_labs','ehuanglu',
        'azed_ai','jeffsynthesized','ai_filmmaker','visiblemaker','magiermogul','wuxiarocks',
        'jiamingsuen','moonvalley','higgsfield_ai','chandan_perla']

for c in CORE:
    if c not in handles:
        handles.append(c)
        print(f"  + added missing core: {c}")

print(f"Final handle count: {len(handles)}")

IRRELEVANT_HANDLES = {
    'aibuzznews','aiguidehq','aitechio','aifrontliner','aiwarper','theaicolony','aitopiaai',
    'googlelabs','googleai','donutai','cladlabs','4aibsc','faithjaiye2187','kammelabala',
    'mystageai','alexstudio44','ai_video_dumps','ai_with_jasmin','ai_vaidehi','charaspowerai',
    'chrislaubai','cinema505','chandan_perla'
}

BIO_INFO = {}

def scan_handle(handle):
    url = f"https://api.getxapi.com/twitter/user/tweets?userName={handle}&count=5"
    try:
        resp = requests.get(url, headers={"Authorization": f"Bearer {API_KEY}"}, timeout=60)
        data = resp.json()
        tweets = data.get("tweets", [])
        return tweets, None
    except Exception as e:
        return None, str(e)

now = datetime.now(timezone.utc)
cutoff = now - timedelta(days=3)

all_results = {}
failed = []

for i, handle in enumerate(handles):
    tweets, err = scan_handle(handle)
    if err:
        failed.append((handle, err))
        print(f"  FAIL {handle}: {err}")
    elif tweets is None:
        failed.append((handle, "no tweets key"))
    else:
        all_results[handle] = tweets
    time.sleep(0.8)

# Score
scored = []  # (score, handle, tweet)
for handle, tweets in all_results.items():
    for tw in tweets:
        if not isinstance(tw, dict):
            continue
        # Skip retweets
        if tw.get('retweeted_tweet'):
            continue
        likes = tw.get('likeCount', 0) or 0
        rts = tw.get('retweetCount', 0) or 0
        replies = tw.get('replyCount', 0) or 0
        views = tw.get('viewCount', 0) or 0
        # date parse
        created = tw.get('createdAt', '')
        try:
            dt = datetime.strptime(created, "%a %b %d %H:%M:%S %z %Y")
        except Exception:
            continue
        if dt < cutoff:
            continue
        if likes < 50 and rts < 10 and views < 1000:
            continue
        score = likes + (rts * 2) + (replies * 3) + (views / 100)
        scored.append((score, handle, tw))

scored.sort(key=lambda x: x[0], reverse=True)

# Save results
today = now.strftime("%Y-%m-%d")
out_path = f"/home/kiro/trend-engine/trends/x/scan_results_{today}_FULL.json"
with open(out_path, "w") as f:
    json.dump({"results": all_results, "failed": failed}, f)

print(f"\nScored {len(scored)} qualifying tweets")
print(f"Failed {len(failed)} handles")

# Build report
report_lines = []
report_lines.append(f"X ACCOUNT MONITOR — {today}")
report_lines.append(f"Scanned {len(handles)} accounts | {len(scored)} qualifying tweets in 3-day window")
report_lines.append("")

# Top 10 (exclude irrelevant handles)
relevant_scored = [(s, h, tw) for (s, h, tw) in scored if h not in IRRELEVANT_HANDLES]
top = relevant_scored[:10]
if top:
    report_lines.append("TOP 10 HIGH-ENGAGEMENT POSTS")
    report_lines.append("=" * 50)
    for rank, (score, handle, tw) in enumerate(top, 1):
        views = tw.get('viewCount', 0) or 0
        likes = tw.get('likeCount', 0) or 0
        rts = tw.get('retweetCount', 0) or 0
        replies = tw.get('replyCount', 0) or 0
        tid = tw.get('id')
        url = f"https://x.com/{handle}/status/{tid}"
        text_snip = (tw.get('text') or '').replace('\n', ' ')[:120]
        created = tw.get('createdAt', '')
        try:
            dt = datetime.strptime(created, "%a %b %d %H:%M:%S %z %Y")
            date_str = dt.strftime("%b %d")
        except Exception:
            date_str = created[:10]
        report_lines.append(f"#{rank} @{handle}")
        report_lines.append(f"    URL: {url}")
        report_lines.append(f"    Views: {views:,} | Likes: {likes:,} | RTs: {rts:,} | Replies: {replies:,} | {date_str}")
        report_lines.append(f"    {text_snip}")
        report_lines.append("")
else:
    report_lines.append("No qualifying tweets found in the last 3 days.")

# Filtered (irrelevant) section
filtered_tweets = [(s, h, tw) for (s, h, tw) in scored if h in IRRELEVANT_HANDLES]
if filtered_tweets:
    report_lines.append("FILTERED (auto-discovered, non-core)")
    report_lines.append("=" * 50)
    for s, h, tw in filtered_tweets[:10]:
        views = tw.get('viewCount', 0) or 0
        tid = tw.get('id')
        url = f"https://x.com/{h}/status/{tid}"
        report_lines.append(f"@{h} — {views:,} views — {url}")

# Failed handles
if failed:
    report_lines.append("")
    report_lines.append(f"FAILED ({len(failed)}):")
    for h, e in failed:
        report_lines.append(f"  @{h}: {e[:60]}")

report = "\n".join(report_lines)
print("\n" + report)

# Write report file
with open(f"/home/kiro/trend-engine/trends/x/x-account-monitor-{today}.txt", "w") as f:
    f.write(report)

print(f"\nReport written to /home/kiro/trend-engine/trends/x/x-account-monitor-{today}.txt")
