#!/usr/bin/env python3
"""Audit aktivitas Instagram StudioSoft lewat Repliz: jumlah post, jenis, status, jeda, dan error.
Data nyata dari API (tidak ada angka karangan)."""
import sys, json, time, urllib.request, urllib.error
from datetime import datetime, timedelta, timezone

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

WIB = timezone(timedelta(hours=7))
ACC = {"STUDIOSOFT_IG": rc._ACC.STUDIOSOFT_IG, "STUDIOSOFT_THREADS": rc._ACC.STUDIOSOFT_THREADS,
       "STUDIOSOFT_FB": rc._ACC.STUDIOSOFT_FB}
nama = {v: k for k, v in ACC.items()}

AUTH = rc.AUTH_HEADER if hasattr(rc, "AUTH_HEADER") else None
BASE = "https://api.repliz.com"
H = {"Authorization": AUTH, "Content-Type": "application/json"} if AUTH else None


def ambil(path):
    r = urllib.request.Request(BASE + path, headers=H)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=120) as x:
                return json.loads(x.read())
        except urllib.error.HTTPError as e:
            return {"err": e.code, "msg": e.read().decode()[:200]}
        except Exception:
            time.sleep(3)
    return {}


def semua_jadwal():
    keluar, page = [], 1
    while True:
        d = ambil(f"/public/schedule?page={page}&limit=100")
        docs = (d or {}).get("docs") or []
        if not docs:
            break
        keluar += docs
        if len(docs) < 100:
            break
        page += 1
    return keluar


print("=== mengambil seluruh jadwal Repliz ===")
jadwal = semua_jadwal()
print(f"   total jadwal di akun Repliz: {len(jadwal)}")

for nama_acc, acc_id in ACC.items():
    milik = [j for j in jadwal if j.get("accountId") == acc_id]
    if not milik:
        print(f"\n■ {nama_acc}: tidak ada jadwal")
        continue
    milik.sort(key=lambda j: j.get("scheduleAt") or "")
    sukses = [j for j in milik if j.get("status") == "success"]
    error = [j for j in milik if j.get("status") == "error"]
    pending = [j for j in milik if j.get("status") == "pending"]
    sekarang = datetime.now(timezone.utc)
    akan = [j for j in pending if (j.get("scheduleAt") or "")[:4] < "2090"
            and datetime.fromisoformat(j["scheduleAt"].replace("Z", "+00:00")) > sekarang]
    print(f"\n■ {nama_acc}")
    print(f"   total {len(milik)} | sukses {len(sukses)} | error {len(error)} | pending {len(pending)} "
          f"(akan tayang {len(akan)})")
    print(f"   tipe: " + ", ".join(f"{t}={sum(1 for j in milik if j.get('type') == t)}"
                                   for t in sorted({j.get("type") for j in milik})))
    if sukses:
        print(f"   tayang pertama {sukses[0]['scheduleAt'][:10]} · terakhir {sukses[-1]['scheduleAt'][:10]}")

    # sebaran 60 hari terakhir
    batas = sekarang - timedelta(days=60)
    per_hari = {}
    for j in sukses:
        t = datetime.fromisoformat(j["scheduleAt"].replace("Z", "+00:00"))
        if t >= batas:
            per_hari.setdefault(t.astimezone(WIB).date().isoformat(), []).append(
                (t.astimezone(WIB).strftime("%H:%M"), j.get("type"), len(j.get("medias") or [])))
    print(f"   sebaran 60 hari: {len(per_hari)} hari ada post")
    kosong = []
    for i in range(59, -1, -1):
        h = (sekarang - timedelta(days=i)).astimezone(WIB).date().isoformat()
        if h not in per_hari:
            kosong.append(h)
    print(f"   hari tanpa post (60 hari): {len(kosong)} → {', '.join(kosong[-12:])}")
    jenis = {}
    for h, isi in per_hari.items():
        for jam, tp, med in isi:
            jenis[tp] = jenis.get(tp, 0) + 1
    print(f"   jenis post 60 hari: {jenis}")
    if error:
        print("   error terakhir:")
        for j in error[-5:]:
            print(f"     {j['scheduleAt'][:16]} | {str(j.get('errorMessage'))[:90]}")

    # rincian 10 hari terakhir
    print("   post terakhir (30 hari):")
    for h in sorted(per_hari)[-30:]:
        isi = sorted(per_hari[h])
        print(f"     {h}: " + " · ".join(f"{jam} {tp}{'/' + str(med) + ' media' if med else ''}" for jam, tp, med in isi))
