#!/usr/bin/env python3
"""One-off TikTok audit for @metowiverse."""

import json, os, sys, time, requests
from pathlib import Path
from dotenv import load_dotenv

ROOT = Path(__file__).parent.parent
load_dotenv(ROOT / ".env")

APIFY_KEY = os.getenv("APIFY_API_KEY")
APIFY_BASE = "https://api.apify.com/v2"
TIMEOUT = 180

def apify_run(actor, input_data):
    resp = requests.post(
        f"{APIFY_BASE}/acts/{actor}/runs",
        params={"token": APIFY_KEY},
        json=input_data,
        timeout=30,
    )
    resp.raise_for_status()
    run = resp.json()["data"]
    run_id = run["id"]
    dataset_id = run["defaultDatasetId"]
    print(f"  Run started: {run_id}")

    deadline = time.time() + TIMEOUT
    while time.time() < deadline:
        sr = requests.get(f"{APIFY_BASE}/actor-runs/{run_id}", params={"token": APIFY_KEY}, timeout=15)
        sr.raise_for_status()
        status = sr.json()["data"]["status"]
        if status == "SUCCEEDED":
            break
        if status in ("FAILED", "ABORTED", "TIMED-OUT"):
            raise RuntimeError(f"Run {run_id} ended: {status}")
        print(f"  waiting... ({status})")
        time.sleep(8)
    else:
        raise TimeoutError("Timed out")

    return requests.get(
        f"{APIFY_BASE}/datasets/{dataset_id}/items",
        params={"token": APIFY_KEY, "format": "json"},
        timeout=30,
    ).json()


def analyze_tiktok(handle):
    handle_clean = handle.lstrip("@")
    print(f"\n{'='*50}")
    print(f"Scraping TikTok @{handle_clean} ...")
    items = apify_run("clockworks~tiktok-profile-scraper", {
        "profiles": [f"@{handle_clean}"],
        "shouldDownloadVideos": False,
        "shouldDownloadCovers": False,
        "resultsLimit": 12,
    })
    if not items:
        print("  No data returned.")
        return

    p = items[0]
    out_path = ROOT / ".tmp" / f"tt_audit_{handle_clean}.json"
    out_path.write_text(json.dumps(p, indent=2, default=str))

    stats = p.get("stats", p)
    followers   = stats.get("followerCount", 0) or p.get("followers", 0) or 0
    following   = stats.get("followingCount", 0) or 0
    likes_total = stats.get("heartCount", 0) or stats.get("diggCount", 0) or 0
    video_count = stats.get("videoCount", 0) or 0
    bio         = p.get("signature", "") or p.get("bio", "") or ""
    verified    = p.get("verified", False)
    nickname    = p.get("nickname", "") or p.get("name", "")
    website     = p.get("bioLink", {}).get("link", "") if isinstance(p.get("bioLink"), dict) else ""

    avg_likes_per_video = round(likes_total / max(video_count, 1))
    ff_ratio = round(followers / following, 1) if following > 0 else None

    # engagement proxy: total likes / (followers * videos)
    engagement_pct = round((likes_total / max(followers, 1)) / max(video_count, 1) * 100, 2)

    print(f"\n--- TikTok @{handle_clean} ({nickname}) ---")
    print(f"  Verified:    {verified}")
    print(f"  Bio:         {bio[:120]}")
    print(f"  Website:     {website}")
    print(f"\n  Followers:   {followers:,}")
    print(f"  Following:   {following:,}")
    print(f"  F/F Ratio:   {ff_ratio}x")
    print(f"  Videos:      {video_count:,}")
    print(f"  Total Likes: {likes_total:,}")
    print(f"  Avg Likes/Video: {avg_likes_per_video:,}")
    print(f"  Eng % proxy: {engagement_pct}%")

    flags = []
    if followers < 1000:
        flags.append(f"LOW FOLLOWERS: {followers:,}")
    if engagement_pct < 2.0:
        flags.append(f"LOW ENGAGEMENT: {engagement_pct}% (aim for 5%+ on TikTok)")
    if not bio.strip():
        flags.append("MISSING BIO")
    if not website:
        flags.append("NO LINK IN BIO")
    if video_count < 10:
        flags.append(f"FEW VIDEOS: {video_count}")

    print(f"\n  FLAGS ({len(flags)}):")
    for f in flags:
        print(f"    ⚠  {f}")
    if not flags:
        print("    ✓ No major issues")

    print(f"\n  Raw data saved: {out_path}")


if __name__ == "__main__":
    analyze_tiktok("metowiverse")
    print("\nDone.")
