#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""tsc_story_audit.py — audit story Instagram TSC.

Tarik semua jadwal Repliz (paginasi), filter akun TSC IG, kelompokkan per tipe
dan per tanggal: hari mana yang sudah punya story, hari mana yang bolong.
Ringkasan <= 20 baris, rincian ditulis ke tsc_story_audit.json.

Pakai: python3 tsc_story_audit.py [--fresh] [--hari 21]
"""
import argparse
import datetime
import json
import os
import sys
import time

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
DUMP = "/tmp/tsc_sched_all.json"
OUT = os.path.join(WS, "tsc_story_audit.json")
sys.path.insert(0, WS)
from repliz_client import get_client  # noqa: E402

TSC_IG = "6a86a7e062caae1e04ff8244"
WIB = datetime.timezone(datetime.timedelta(hours=7))


def semua_jadwal(fresh=False):
    if not fresh and os.path.exists(DUMP) and time.time() - os.path.getmtime(DUMP) < 3600:
        return json.load(open(DUMP))
    c = get_client()
    docs, page = [], 1
    while page <= 80:
        r = None
        for a in range(5):
            try:
                r = c.get_schedules(page=page, limit=100)
                break
            except Exception:
                time.sleep(3 + 2 * a)
        if r is None:
            raise SystemExit("gagal baca jadwal Repliz")
        b = r.get("docs") or []
        docs += b
        if len(b) < 100:
            break
        page += 1
    json.dump(docs, open(DUMP, "w"))
    return docs


def tgl_wib(iso):
    if not iso:
        return None
    try:
        s = iso.replace("Z", "+00:00")
        return datetime.datetime.fromisoformat(s).astimezone(WIB).date()
    except Exception:
        return None


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--fresh", action="store_true")
    ap.add_argument("--hari", type=int, default=21)
    a = ap.parse_args()

    docs = semua_jadwal(a.fresh)
    ig = [d for d in docs if d.get("accountId") == TSC_IG]
    hari_ini = datetime.datetime.now(WIB).date()
    akhir = hari_ini + datetime.timedelta(days=a.hari - 1)

    per_tipe = {}
    for d in ig:
        per_tipe.setdefault(d.get("type") or "?", []).append(d)

    story = [d for d in ig if (d.get("type") or "") == "story"]
    story_aktif = {}
    for d in story:
        t = tgl_wib(d.get("scheduleAt"))
        if not t:
            continue
        if t < hari_ini or t > akhir:
            continue
        story_aktif.setdefault(t, []).append(d)

    bolong = [hari_ini + datetime.timedelta(days=i) for i in range(a.hari)
              if (hari_ini + datetime.timedelta(days=i)) not in story_aktif]

    rincian = {
        "dibuat": datetime.datetime.now(WIB).isoformat(),
        "hari_ini": str(hari_ini),
        "total_jadwal_ig": len(ig),
        "per_tipe": {k: len(v) for k, v in sorted(per_tipe.items())},
        "story_di_jendela": {
            str(t): [{"id": d.get("_id"), "status": d.get("status"),
                      "jam_wib": d.get("scheduleAt"), "media": len(d.get("medias") or [])}
                     for d in v]
            for t, v in sorted(story_aktif.items())},
        "hari_bolong": [str(x) for x in bolong],
        "riwayat_story": sorted({str(tgl_wib(d.get("scheduleAt"))) for d in story
                                 if tgl_wib(d.get("scheduleAt"))}),
    }
    json.dump(rincian, open(OUT, "w"), indent=1)

    print(f"TSC IG — {len(ig)} jadwal total | per tipe: "
          + ", ".join(f"{k}={v}" for k, v in sorted(rincian['per_tipe'].items())))
    print(f"Story di jendela {hari_ini} .. {akhir}: {len(story_aktif)} hari terisi, "
          f"{len(bolong)} hari bolong")
    if story_aktif:
        for t, v in sorted(story_aktif.items())[:25]:
            for d in v:
                jam = d.get("scheduleAt", "")[11:16]
                print(f"  {t} {jam}Z {d.get('status')} media={len(d.get('medias') or [])} {d.get('title') or ''}")
    if bolong:
        print("  BOLONG: " + ", ".join(str(x) for x in bolong[:25]))
    print(f"rincian: {OUT}")


if __name__ == "__main__":
    main()
