import os, re, json, time, requests
from datetime import datetime, timedelta, timezone

# --- API key from ~/.hermes/.env ---
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
if not API_KEY:
    print("NO API KEY FOUND")
    raise SystemExit(1)

# --- Watchlist ---
watch_path = "/home/kiro/trend-engine/trends/x/raw/rising-accounts.md"
with open(watch_path) as f:
    content = f.read()

SKIP_WORDS = {'x', 'youtube', 'facebook', 'marketingbrew', 'besttwitteraccounts',
              'theankler', 'xo2', 'pixflow', 'blogs', 'nvidia', 'etcjournal',
              'letsdatascience', 'higgsfield', 'lang', 'en', 'with', 'replies',
              'highlights', 'status', 'com', 'ai', 'film', 'gallery', 'the', 'void',
              'of', 'plenty', 'stories', 'fiverr', 'storytelling', 'has', 'arrived',
              'watch', 'v', 'pc2vqtqh1qc', 'www', 'may', 'p', 'in', 'the', 'studio'}

# Verify core handles NOT in SKIP_WORDS
CORE = {'nofilmschool', 'curiousrefuge'}
for h in CORE:
    assert h not in SKIP_WORDS, f"ERROR: {h} in SKIP_WORDS"

handles = re.findall(r'@(\w+)', content)
handles = [h for h in handles if h.lower() not in {s.lower() for s in SKIP_WORDS}]

# dedupe preserving order
seen = set()
unique = []
for h in handles:
    if h.lower() not in seen:
        seen.add(h.lower())
        unique.append(h)
handles = unique

IRRELEVANT = {
    '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',
}

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)
        if resp.status_code != 200:
            return [], f"HTTP {resp.status_code}"
        data = resp.json()
        tweets = data.get("tweets", [])
        if not isinstance(tweets, list):
            tweets = []
        return tweets, None
    except Exception as e:
        return [], str(e)

now = datetime.now(timezone.utc)
cutoff = now.replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=3)

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

results = {}
failed = []
for h in handles:
    tweets, err = scan_handle(h)
    if err:
        failed.append((h, err))
    else:
        results[h] = tweets
    time.sleep(0.8)

# --- Score ---
qualifying = []  # (handle, tweet, score, likes, rt, replies, views, dt)
filtered = []    # irrelevant handle tweets that still qualify

for h, tweets in results.items():
    for t in tweets:
        if not isinstance(t, dict):
            continue
        ttype = t.get("type", "tweet")
        # skip retweets of others
        if t.get("retweeted_tweet"):
            continue
        likes = int(t.get("likeCount") or 0)
        rt = int(t.get("retweetCount") or 0)
        replies = int(t.get("replyCount") or 0)
        views = int(t.get("viewCount") or 0)
        created = t.get("createdAt")
        dt = parse_dt(created) if created else None
        if dt is None:
            continue
        if dt < cutoff:
            continue
        score = likes + (rt * 2) + (replies * 3) + (views / 100)
        if likes >= 50 or rt >= 10 or views >= 1000:
            entry = (h, t, score, likes, rt, replies, views, dt)
            if h in IRRELEVANT or h.lower() in {x.lower() for x in IRRELEVANT}:
                filtered.append(entry)
            else:
                qualifying.append(entry)

qualifying.sort(key=lambda e: e[2], reverse=True)
filtered.sort(key=lambda e: e[2], reverse=True)

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

# --- Report ---
lines = []
lines.append(f"X ACCOUNT MONITOR — {now.strftime('%Y-%m-%d %H:%M')} UTC")
lines.append(f"Scanned: {len(results)} accounts | Failed: {len(failed)} | Window: last 3 days")
if failed:
    lines.append("Failed: " + ", ".join(f"{h}({e})" for h, e in failed))
lines.append("")

lines.append("TOP 10 HIGH-ENGAGEMENT")
lines.append("=" * 40)
for i, (h, t, score, likes, rt, replies, views, dt) in enumerate(qualifying[:10], 1):
    tid = t.get("id")
    url = f"https://x.com/{h}/status/{tid}"
    text = (t.get("text") or "").replace("\n", " ").strip()
    if len(text) > 140:
        text = text[:140] + "..."
    lines.append(f"{i}. @{h}")
    lines.append(f"   {text}")
    lines.append(f"   Views: {views} | Likes: {likes} | RT: {rt} | Replies: {replies}")
    lines.append(f"   {url}")
    lines.append(f"   {dt.strftime('%Y-%m-%d')}")
    lines.append("")

if filtered:
    lines.append("FILTERED (auto-discovered / non-core, still qualifying)")
    lines.append("=" * 40)
    for h, t, score, likes, rt, replies, views, dt in filtered[:10]:
        tid = t.get("id")
        url = f"https://x.com/{h}/status/{tid}"
        text = (t.get("text") or "").replace("\n", " ").strip()
        if len(text) > 120:
            text = text[:120] + "..."
        lines.append(f"- @{h}: {text}")
        lines.append(f"  Views {views} | {url}")
        lines.append("")

if not qualifying and not filtered:
    lines.append("No qualifying tweets in the 3-day window.")

print("\n".join(lines))
