#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Gabungkan statistik views harian (Repliz statistic) dengan jumlah post tayang per hari.

Jawab pertanyaan "kok views Threads kurang": berapa views per post, hari mana yang jatuh,
dan apa yang berubah pada hari itu.

Pakai: python3 analisa_views_threads_20261012.py [--hari 30]
"""
import argparse
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))


def semua_halaman(c, path, maks=60):
    docs, page = [], 1
    while page <= maks:
        r = None
        for _ in range(10):
            try:
                r = c.get(f"{path}?page={page}&limit=100")
                break
            except Exception:
                r = None
        if r is None:
            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():
    p = argparse.ArgumentParser()
    p.add_argument("--hari", type=int, default=21)
    a = p.parse_args()

    c = ReplizClient()
    akun = [x for x in semua_halaman(c, "/public/account") if x.get("type") == "threads"]
    jadwal = semua_halaman(c, "/public/schedule")
    tgl_batas = (datetime.datetime.now(WIB) - datetime.timedelta(days=a.hari)).date()

    ringkas = []
    for x in akun:
        aid = x["_id"]
        try:
            st = c.get(f"/public/account/{aid}/statistic")
        except Exception as e:
            print(f"@{x.get('username')} → error stat: {str(e)[:80]}")
            continue
        views = {str(g["date"])[:10]: (g.get("value") or 0)
                 for g in ((st.get("views") or {}).get("graphs") or [])}
        per_hari = collections.defaultdict(lambda: collections.Counter())
        for s in jadwal:
            if (s.get("account") or {}).get("_id") != aid:
                continue
            t = s.get("scheduleAt") or ""
            try:
                d = datetime.datetime.fromisoformat(t.replace("Z", "+00:00")).astimezone(WIB).date()
            except ValueError:
                continue
            if d < tgl_batas:
                continue
            k = d.isoformat()
            if s.get("status") == "success":
                per_hari[k]["post"] += 1
                if "http" in (s.get("description") or ""):
                    per_hari[k]["link"] += 1
                if s.get("medias"):
                    per_hari[k]["media"] += 1
                else:
                    per_hari[k]["teks"] += 1
            elif s.get("status") == "error":
                per_hari[k]["gagal"] += 1
            else:
                per_hari[k]["pending"] += 1

        print(f"\n===== @{x.get('username')} | followers {st.get('followersCount')} =====")
        print("tgl        views  post  link  media teks gagal pending  views/post")
        tv = tp = 0
        for i in range(a.hari, -1, -1):
            d = (datetime.datetime.now(WIB).date() - datetime.timedelta(days=i)).isoformat()
            v = views.get(d, 0)
            h = per_hari[d]
            post = h["post"]
            tv += v
            tp += post
            vp = f"{v/post:7.1f}" if post else "      -"
            print(f"{d[5:]}  {v:5d}  {post:4d}  {h['link']:4d}  {h['media']:5d} {h['teks']:4d} "
                  f"{h['gagal']:5d}  {h['pending']:6d}  {vp}")
        vp_total = f"{tv/tp:.1f}" if tp else "n/a"
        print(f"TOTAL {a.hari+1} hari: views {tv} | post tayang {tp} | views/post {vp_total}")
        print(f"likes={st.get('likes')} replies={st.get('replies')} reposts={st.get('reposts')} "
              f"klik_link={(st.get('clicks') or {}).get('total')}")
        ringkas.append((x.get("username"), st.get("followersCount"), tv, tp,
                        tv / tp if tp else 0))

    print("\n\n===== RINGKASAN =====")
    print("akun                    followers   views   post  views/post")
    for nama, f, tv, tp, vp in sorted(ringkas, key=lambda z: -z[2]):
        print(f"@{nama:<22} {f:>6}  {tv:>7}  {tp:>5}  {vp:>8.1f}")


if __name__ == "__main__":
    main()
