#!/usr/bin/env python3
"""Audit menyeluruh jadwal PENDING Repliz semua akun: media lengkap + URL media live."""
import json, sys, time
import concurrent.futures
import urllib.request, urllib.error
from collections import Counter, defaultdict

sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import get_client

DUMP = "/home/mantapman/.hermes/profiles/atun/workspace/repliz_audit_dump.json"
OUT = "/home/mantapman/.hermes/profiles/atun/workspace/repliz_pending_audit.json"

def fetch_all():
    c = get_client()
    r = c.get_schedules(page=1, limit=100)
    total = r["totalDocs"]
    pages = (total + 99) // 100
    docs = list(r["docs"])
    for p in range(2, pages + 1):
        rr = c.get_schedules(page=p, limit=100)
        docs.extend(rr["docs"])
    with open(DUMP, "w") as f:
        json.dump(docs, f)
    print(f"📦 fetched {len(docs)}")
    return docs

def check_url(url, timeout=25):
    req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "Mozilla/5.0", "Range": "bytes=0-1023"})
    try:
        with urllib.request.urlopen(req, timeout=timeout) as resp:
            return resp.status
    except urllib.error.HTTPError as e:
        if e.code in (403, 405):
            try:
                req2 = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0", "Range": "bytes=0-1023"})
                with urllib.request.urlopen(req2, timeout=timeout) as resp2:
                    return resp2.status
            except urllib.error.HTTPError as e2:
                return e2.code
            except Exception:
                return "ERR-GET"
        return e.code
    except Exception as e:
        return f"ERR-{type(e).__name__}"

def media_type_of(m):
    t = (m.get("type") or "").lower()
    u = (m.get("url") or "").lower()
    if t == "video" or ".mp4" in u: return "video"
    if t == "image" or t in ("photo", "image/jpeg", "image/png") or any(x in u for x in (".jpg", ".jpeg", ".png", ".webp")): return "image"
    return t or "unknown"

def main():
    fresh = len(sys.argv) > 1 and sys.argv[1] == "fetch"
    docs = fetch_all() if fresh else json.load(open(DUMP))
    print(f"📂 {len(docs)} jadwal total")

    # ── Filter pending (status pending + scheduleAt masa depan) ──
    now = time.time() * 1000  # ms
    pending = []
    for d in docs:
        st = (d.get("status") or "").lower()
        if st == "pending":
            pending.append(d)
        elif st in ("", None, "draft", "scheduled"):
            pending.append(d)
    # cek juga yang status selain success/error tapi scheduleAt future
    for d in docs:
        st = (d.get("status") or "").lower()
        if st not in ("pending", "success", "error", "", "draft", "scheduled") and d not in pending:
            pending.append(d)
    print(f"⏳ jadwal pending/draft: {len(pending)}")

    # ── Klasifikasi per akun + cek media ──
    by_acct = defaultdict(list)
    for d in pending:
        nm = (d.get("account") or {}).get("name", "?") or "?"
        by_acct[nm].append(d)

    print(f"👥 akun dengan jadwal pending: {len(by_acct)}")
    for nm, lst in sorted(by_acct.items(), key=lambda x: -len(x[1])):
        print(f"   {nm}: {len(lst)}")

    # ── Cek media requirement ──
    text_types = {"text", "link"}
    issues = []
    ok_count = 0
    for d in pending:
        t = (d.get("type") or "").lower()
        medias = d.get("medias") or []
        acc = (d.get("account") or {}).get("name", "?")
        if t in text_types or t == "":
            # text-only — kalau ada media tetap cek
            if medias:
                ok_count += 1
            else:
                ok_count += 1
            continue
        if not medias:
            issues.append({"id": d["id"], "acc": acc, "type": t, "issue": "TANPA MEDIA", "at": d.get("scheduleAt"), "title": (d.get("title") or "")[:60]})
            continue
        # cek ada media yang relevan
        has_media = any(m.get("url") for m in medias)
        if not has_media:
            issues.append({"id": d["id"], "acc": acc, "type": t, "issue": "MEDIA KOSONG URL", "at": d.get("scheduleAt"), "title": (d.get("title") or "")[:60]})
        else:
            ok_count += 1

    # ── Cek semua URL media pending (unik) ──
    url_map = {}
    for d in pending:
        for m in (d.get("medias") or []):
            u = m.get("url")
            if u:
                url_map.setdefault(u, []).append(d["id"])
    print(f"🔗 URL media unik (pending): {len(url_map)}")

    results = {}
    with concurrent.futures.ThreadPoolExecutor(max_workers=12) as ex:
        fut = {ex.submit(check_url, u): u for u in url_map}
        done = 0
        for f in concurrent.futures.as_completed(fut):
            u = fut[f]
            try:
                results[u] = f.result()
            except Exception as e:
                results[u] = f"ERR-{e}"
            done += 1
            if done % 100 == 0:
                print(f"  ...{done}/{len(url_map)}", flush=True)

    bad = {u: s for u, s in results.items() if s != 200}
    good = {u: s for u, s in results.items() if s == 200}
    print(f"\n✅ URL OK: {len(good)}/{len(results)}")
    print(f"❌ URL bermasalah: {len(bad)}")

    # URL error → jadwal mana
    url_issue_scheds = defaultdict(list)
    for u, s in bad.items():
        for sid in url_map[u]:
            url_issue_scheds[sid].append({"url": u, "status": s})

    # gabung
    all_issues = []
    for d in pending:
        sid = d["id"]
        acc = (d.get("account") or {}).get("name", "?")
        entry = {"id": sid, "acc": acc, "type": d.get("type"), "at": d.get("scheduleAt"), "title": (d.get("title") or "")[:60]}
        if sid in url_issue_scheds:
            entry["url_errors"] = url_issue_scheds[sid]
            all_issues.append(entry)
    for i in issues:
        if i["id"] not in url_issue_scheds:
            all_issues.append(i)

    # ringkasan per akun
    acc_issue = Counter(i["acc"] for i in all_issues)
    acc_pending = Counter((d.get("account") or {}).get("name", "?") for d in pending)

    report = {
        "generated": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
        "total_jadwal": len(docs),
        "total_pending": len(pending),
        "akun_pending": dict(acc_pending),
        "url_ok": len(good),
        "url_bad": len(bad),
        "jadwal_bermasalah": len(all_issues),
        "jadwal_bermasalah_per_akun": dict(acc_issue),
        "detail": sorted(all_issues, key=lambda x: x["acc"]),
    }
    with open(OUT, "w") as f:
        json.dump(report, f, indent=1, ensure_ascii=False)
    print(f"\n📄 laporan: {OUT}")
    print(f"⚠️  jadwal pending bermasalah: {len(all_issues)}")
    if acc_issue:
        print("per-akun:", dict(acc_issue))

if __name__ == "__main__":
    main()
