#!/usr/bin/env python3
"""Hitung postingan Threads per hari per akun aktif (jadwal pending, 30 hari ke depan).
Balasan yang dibuat sebagai jadwal terpisah (anak reply) TIDAK dihitung sebagai postingan.
"""
import json, datetime, collections
docs = json.load(open('/tmp/threads_reply_dump.json'))
WIB = datetime.timezone(datetime.timedelta(hours=7))
AKUN = {
    "6a334e89c5ff4ce3a3225a48": "uky", "6a335b9ec5ff4ce3a3225c2a": "ss",
    "6a35f8b7c5ff4ce3a322b2ed": "tslaw", "6a39e461c5ff4ce3a3233e09": "das",
    "6a4bbc5920e4f4f195e52960": "tsc", "6a44ed1920e4f4f195d8ecf7": "everybe",
}


def induk(d):
    for r in d.get("replies") or []:
        if isinstance(r, dict):
            k = [x for x in r.keys() if x.isdigit()]
            if 8 <= len(k) < 40:
                return "".join(str(r[x]) for x in sorted(k, key=int))
    return None


id_anak = {d.get("_id") for d in docs if induk(d)}
now = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%S")
per_hari = collections.defaultdict(lambda: collections.Counter())
rincian = collections.defaultdict(list)
for d in docs:
    a = AKUN.get(d.get("accountId"))
    if not a or d.get("status") != "pending" or (d.get("scheduleAt") or "") <= now:
        continue
    if d.get("_id") in id_anak:
        continue
    t = datetime.datetime.fromisoformat(d["scheduleAt"].replace("Z", "+00:00")).astimezone(WIB)
    per_hari[t.date()][a] += 1
    rincian[(t.date(), a)].append(t.strftime("%H:%M"))
hari = sorted(per_hari)[:30]
print("tanggal      " + "".join(f"{a:>9s}" for a in ("das", "everybe", "ss", "tsc", "tslaw", "uky")))
total_lebih = collections.Counter()
for tgl in hari:
    row = per_hari[tgl]
    for a, n in row.items():
        if n > 1:
            total_lebih[a] += n - 1
    print(f"{tgl}  " + "".join(f"{row.get(a, 0):9d}" for a in ("das", "everybe", "ss", "tsc", "tslaw", "uky")))
print("\nkelebihan postingan (>1/hari) dalam 30 hari:", dict(total_lebih),
      "| total:", sum(total_lebih.values()))
print("\ncontoh jam per akun pada 3 hari pertama:")
for tgl in hari[:3]:
    for a in ("das", "everybe", "ss", "tsc", "tslaw", "uky"):
        j = rincian.get((tgl, a))
        if j:
            print(f"  {tgl} {a:8s} {len(j)} post: {', '.join(sorted(j))}")
