#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Diagnosa "views Threads turun" (12 Okt 2026, perintah Bos).

Read-only. Mengukur dari API Repliz apa yang BISA diukur:
  - volume tayang (status success) per akun Threads per hari, 21 hari terakhir
  - bauran tipe/media/link/replies
  - error terbaru + sebabnya
  - komentar masuk per akun (proxy engagement)
  - percobaan endpoint insights (kalau tembus = ada angka jangkauan)

Pakai: python3 diag_threads_views_20261012.py
"""
import collections
import datetime
import json
import sys

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from repliz_client import ReplizClient  # noqa: E402

WIB = datetime.timezone(datetime.timedelta(hours=7))
LINK = "http"


def semua_halaman(c, path, maks=80):
    docs, page = [], 1
    while page <= maks:
        for _ in range(15):
            try:
                r = c.get(f"{path}?page={page}&limit=100")
                break
            except Exception:
                r = None
        if r is None:
            print(f"  ⚠️ gagal halaman {page} {path}")
            break
        d = r.get("docs") or []
        docs += d
        if not d or page * 100 >= (r.get("totalDocs") or 0):
            break
        page += 1
    return docs


def main():
    c = ReplizClient()
    akun = semua_halaman(c, "/public/account")
    threads = [a for a in akun if a.get("type") == "threads"]
    print(f"akun Threads di Repliz: {len(threads)}")
    for a in threads:
        print(f"  {a.get('username'):<24} | {a.get('name')} | {a['_id']}")

    jadwal = semua_halaman(c, "/public/schedule")
    print(f"\ntotal jadwal terbaca: {len(jadwal)}")

    now = datetime.datetime.now(datetime.timezone.utc)
    awal = now - datetime.timedelta(days=21)

    per_akun = {}
    for a in threads:
        mine = [x for x in jadwal if (x.get("account") or {}).get("_id") == a["_id"]]
        mine.sort(key=lambda x: x.get("scheduleAt") or "")
        per_akun[a["username"]] = mine

    print("\n=== VOLUME PER HARI (status jadwal, WIB) 21 hari terakhir ===")
    for uname, mine in per_akun.items():
        hari = collections.defaultdict(collections.Counter)
        for x in mine:
            t = x.get("scheduleAt") or ""
            try:
                dt = datetime.datetime.fromisoformat(t.replace("Z", "+00:00")).astimezone(WIB)
            except ValueError:
                continue
            if dt < awal:
                continue
            hari[dt.strftime("%d/%m")][x.get("status")] += 1
        if not hari:
            print(f"\n@{uname}: TIDAK ADA jadwal 21 hari terakhir")
            continue
        print(f"\n@{uname} — jadwal 21 hari terakhir: {sum(sum(v.values()) for v in hari.values())}")
        for d in sorted(hari, key=lambda s: (s[3:], s[:2])):
            ct = hari[d]
            print(f"   {d}: success={ct.get('success',0)} pending={ct.get('pending',0)} "
                  f"error={ct.get('error',0)} draft={ct.get('draft',0)}")

    print("\n=== BAURAN & ERROR (semua jadwal akun Threads) ===")
    for uname, mine in per_akun.items():
        if not mine:
            continue
        stat = collections.Counter(x.get("status") for x in mine)
        tipe = collections.Counter(x.get("type") for x in mine)
        ber_link = sum(1 for x in mine if LINK in (x.get("description") or ""))
        ada_media = sum(1 for x in mine if x.get("medias"))
        ada_reply = sum(1 for x in mine if x.get("replies"))
        err = [(x.get("scheduleAt") or "")[:10] + " " + (x.get("errorMessage") or "")[:70]
               for x in mine if x.get("status") == "error"]
        print(f"\n@{uname}: total {len(mine)} | {dict(stat)}")
        print(f"   tipe={dict(tipe)} | ber-link={ber_link} | ada-media={ada_media} | ada-replies={ada_reply}")
        if err:
            print("   error terakhir:")
            for e in err[-5:]:
                print("     ", e)

    print("\n=== KOMENTAR MASUK (proxy engagement) ===")
    kom = semua_halaman(c, "/public/comment")
    print(f"total komentar terbaca: {len(kom)}")
    nama_id = {a["_id"]: a.get("username") for a in threads}
    per = collections.Counter(x.get("accountId") for x in kom)
    for aid, n in per.most_common(20):
        print(f"  {nama_id.get(aid, aid):<24} {n}")
    batas = (now - datetime.timedelta(days=14)).strftime("%Y-%m-%d")
    baru = [x for x in kom if str(x.get("createdAt") or "") >= batas]
    print(f"\n14 hari terakhir: {len(baru)} komentar")
    for aid, n in collections.Counter(x.get("accountId") for x in baru).most_common(20):
        print(f"  {nama_id.get(aid, aid):<24} {n}")

    print("\n=== COBA ENDPOINT INSIGHTS ===")
    uky = next((a for a in threads if a.get("username") == "ukyhandoko"), None)
    kandidat = []
    if uky:
        kandidat = [
            ("GET", "/public/account/insights?accountId=" + uky["_id"], None),
            ("GET", "/public/account/insights?accountId=" + uky["_id"] + "&period=30", None),
            ("GET", "/public/insights?accountId=" + uky["_id"], None),
            ("GET", "/public/account/" + uky["_id"] + "/insights", None),
            ("GET", "/public/analytics/account?accountId=" + uky["_id"], None),
            ("GET", "/public/schedule/insights?accountId=" + uky["_id"], None),
        ]
    for metode, jalur, body in kandidat:
        try:
            r = c.get(jalur) if metode == "GET" else c.post(jalur, body)
            print(f"  ✅ {jalur[:80]} → {json.dumps(r)[:200]}")
        except Exception as e:
            print(f"  ❌ {jalur[:80]} → {str(e)[:110]}")


if __name__ == "__main__":
    main()
