#!/usr/bin/env python3
"""Scan semua jadwal Repliz -> set URL terpakai per akun Threads + global.
Tahan error 500/104 (retry). Output: /tmp/threads_used_all.json
Format: {"studiosoft":[...],..., "_global":[...], "_pending_count":{acc:n}}
"""
import sys, json, re, time

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

LOG = f"{WS}/log_threads_harian.json"
OUT = "/tmp/threads_used_all.json"

ACC_MAP = {
    "studiosoft": ACC.STUDIOSOFT_THREADS,
    "uky": ACC.UKY_THREADS,
    "tslaw": ACC.TSLAW_THREADS,
    "tsc": ACC.TSC_THREADS,
    "das": ACC.DAS_THREADS,
}


def norm(u):
    return u.rstrip("/.,)").lower()


def get_page(c, p, tries=15):
    last = None
    for i in range(tries):
        try:
            r = c.get_schedules(page=p, limit=100)
            if i:
                print(f"  (page {p} OK di percobaan {i+1})")
            return r
        except Exception as e:
            last = e
            time.sleep(min(45, 3 + 4 * i))
    raise last


def main():
    c = get_client()
    docs = []
    for p in range(1, 150):
        r = get_page(c, p)
        b = r.get("docs", [])
        if not b:
            break
        docs += b
        print("page", p, "got", len(b), "total", len(docs))
        if len(b) < 100:
            break
    print("TOTAL schedules:", len(docs))

    log = json.load(open(LOG))
    out = {}
    glob = set()
    pend_count = {}
    for name, aid in ACC_MAP.items():
        used = set()
        pend = 0
        for d in docs:
            if d.get("accountId") != aid:
                continue
            if (d.get("status") or "").lower() in ("pending", "draft"):
                pend += 1
            blob = " ".join([d.get("description") or "", d.get("title") or ""])
            for u in re.findall(r"https?://[^\s\)\]\"']+", blob):
                used.add(norm(u))
        for _date, accs in (log.get("threads_used_links") or {}).items():
            for it in accs.get(name, []):
                used.add(norm(it.get("url", "")))
        out[name] = sorted(x for x in used if x)
        glob |= set(out[name])
        pend_count[name] = pend
    out["_global"] = sorted(glob)
    out["_pending_count"] = pend_count

    # free slots per akun: jam WIB yang belum terisi pending
    from datetime import datetime, timedelta, timezone
    WIB = timezone(timedelta(hours=7))
    now = datetime.now(WIB)
    freeslots = {}
    for name, aid in ACC_MAP.items():
        taken = set()
        for d in docs:
            if d.get("accountId") == aid and (d.get("status") or "").lower() in ("pending", "draft"):
                sa = d.get("scheduleAt") or ""
                taken.add(sa[:13])
        first = None
        for day in range(0, 25):
            day0 = (now + timedelta(days=day)).replace(minute=0, second=0, microsecond=0)
            for h in [5, 8, 11, 14, 17, 20, 23]:
                cand = day0.replace(hour=h)
                if cand <= now:
                    continue
                u = cand.astimezone(timezone.utc).strftime("%Y-%m-%dT%H")
                if u not in taken:
                    first = cand.strftime("%Y-%m-%d %H:%M")
                    break
            if first:
                break
        freeslots[name] = first
    out["_free_first"] = freeslots

    with open(OUT, "w") as f:
        json.dump(out, f, indent=1, ensure_ascii=False)
    print("pending per akun:", pend_count)
    print("free slot pertama per akun:", freeslots)
    for k in ACC_MAP:
        print(f"  {k}: {len(out[k])} URL terpakai")
    print("saved", OUT)


main()
