#!/usr/bin/env python3
"""Audit SEBARAN LINK studiosoft.id di semua akun Repliz.

Output:
  - per akun: jumlah pending, rentang jadwal pending, jumlah jadwal (semua status)
    yang memuat 'studiosoft.id' di description / medias / title
  - daftar akun IDLE (0 pending mendatang) yang bisa dipakai untuk sebarkan link

Pakai: python3 audit_link_ss.py [--dump out.json]
"""
import json
import sys
from collections import defaultdict

from repliz_client import get_client, ReplizError


def all_docs(c):
    docs, page = [], 1
    while True:
        r = c.get_schedules(page=page, limit=100)
        d = r.get("docs") or r.get("data") or []
        if not d:
            break
        docs.extend(d)
        if len(d) < 100:
            break
        page += 1
    return docs


def main():
    c = get_client()
    docs = all_docs(c)
    print(f"total schedules: {len(docs)}")

    accs = c.get("/public/account?page=1&limit=100").get("docs", [])
    name = {a["_id"]: f"{a.get('type')}:{a.get('name')}({a.get('username','')})" for a in accs}

    now = "2026-09-15T00:00:00.000Z"  # diganti jam nyata di bawah
    from datetime import datetime, timezone
    now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")

    per = defaultdict(lambda: {"total": 0, "pending": 0, "pending_range": [], "success": 0,
                               "error": 0, "idle": 0, "ss_link": 0, "ss_link_pending": 0})
    for d in docs:
        a = d.get("accountId")
        p = per[a]
        p["total"] += 1
        st = d.get("status")
        p[st] = p.get(st, 0) + 1
        blob = json.dumps(d, ensure_ascii=False)
        has_ss = "studiosoft.id" in blob
        if has_ss:
            p["ss_link"] += 1
        sa = d.get("scheduleAt") or ""
        if st in ("pending", "draft", "processing") and sa >= now:
            p["pending"] += 1
            p["pending_range"].append(sa)
            if has_ss:
                p["ss_link_pending"] += 1
        if st == "success":
            p["success"] += 1
        if st == "error":
            p["error"] += 1

    print(f"\n{'AKUN':55s} {'TOT':>5s} {'PEND':>5s} {'SSlink':>6s} {'SSpend':>6s} {'succ':>5s} {'err':>5s}  PENDING RANGE")
    for a, p in sorted(per.items(), key=lambda x: -x[1]["pending"]):
        rng = f"{min(p['pending_range'])[:16]} → {max(p['pending_range'])[:16]}" if p["pending_range"] else "-"
        print(f"{name.get(a,a)[:55]:55s} {p['total']:5d} {p['pending']:5d} {p['ss_link']:6d} {p['ss_link_pending']:6d} {p['success']:5d} {p['error']:5d}  {rng}")

    idle = [a for a, p in per.items() if p["pending"] == 0]
    print(f"\nAKUN IDLE (0 pending mendatang): {len(idle)}")
    for a in idle:
        p = per[a]
        print(f"  - {name.get(a,a)}  (total {p['total']}, success {p['success']}, error {p['error']})")

    if "--dump" in sys.argv:
        out = sys.argv[sys.argv.index("--dump") + 1]
        with open(out, "w") as f:
            json.dump(docs, f)
        print(f"\ndump → {out}")


if __name__ == "__main__":
    try:
        main()
    except ReplizError as e:
        print("ReplizError:", e)
        sys.exit(1)
