#!/usr/bin/env python3
"""Perbaikan ritme @ukyhandoko: 3 post/hari (dari 6), jam diacak ±, sisanya disebar ke hari berikutnya.
Postingan uji (gaya kasus nyata) tetap di sekitar 09:30 agar uji 21 hari tetap sah.
Pakai --apply untuk menerapkan."""
import json, random, sys
from collections import defaultdict
from datetime import datetime, timedelta, timezone

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

client = get_client()
random.seed(20261005)          # tetap, supaya hasilnya bisa diulang

PER_HARI = 3
JENDELA_HARI = 21
BASIS_JAM = [8, 12, 20]        # tiga jendela tayang per hari (WIB)
JITTER_MENIT = 25              # ± menit agar tidak persis sama

semua, page = [], 1
while True:
    d = client.get_schedules(page=page, limit=100)
    rows = d.get("docs", []) if isinstance(d, dict) else []
    semua += rows
    if len(rows) < 100:
        break
    page += 1

sekarang = datetime.now(timezone.utc)
hari_ini = (sekarang + timedelta(hours=7)).date()
batas = sekarang + timedelta(days=JENDELA_HARI)

kandidat = []
for s in semua:
    if s.get("accountId") != ACC.UKY_THREADS or s.get("status") != "pending":
        continue
    kapan = str(s.get("scheduleAt") or "")
    if kapan >= "2090":
        continue
    try:
        t = datetime.fromisoformat(kapan.replace("Z", "+00:00"))
    except Exception:
        continue
    if sekarang <= t <= batas:
        desc = str(s.get("description") or "")
        kandidat.append({"id": s.get("_id"), "waktu": t, "desc": desc,
                         "uji": "Kalian" in desc[:40] or "Klien" in desc[:40] or "Saya" in desc[:40], 
                         "gambar": s.get("type") in ("image", "album")})

kandidat.sort(key=lambda x: x["waktu"])
print(f"jadwal @ukyhandoko dalam {JENDELA_HARI} hari: {len(kandidat)}")
print(f"   dari jumlah itu, bergaya uji (kasus nyata): {sum(1 for k in kandidat if k['uji'])}")

# susun ulang: 3 per hari, jam diacak; kelebihannya bergeser ke hari-hari berikutnya
hari_urut = [hari_ini + timedelta(days=i) for i in range(JENDELA_HARI + 30)]
rencana, i = [], 0
for hari in hari_urut:
    if i >= len(kandidat):
        break
    for jam in BASIS_JAM:
        if i >= len(kandidat):
            break
        k = kandidat[i]
        i += 1
        # postingan uji diarahkan ke sekitar 09:30, yang lain ke jam basis + acak
        if k["uji"]:
            menit = 30 + random.randint(-10, 10)
            jam_wib = 9
        else:
            jam_wib = jam
            menit = random.randint(0, 59) if random.random() < 0.5 else random.choice([5, 12, 23, 37, 48])
        jam_utc = (jam_wib - 7) % 24
        geser = 0 if jam_wib - 7 >= 0 else 1
        slot = datetime(hari.year, hari.month, hari.day, jam_utc, max(0, min(59, menit)), 0,
                        tzinfo=timezone.utc) + timedelta(days=geser)
        if slot <= sekarang + timedelta(hours=2):
            slot += timedelta(days=1)
        rencana.append({**k, "slot": slot.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
                        "wib": (slot + timedelta(hours=7)).strftime("%d %b %H:%M")})

per_hari = defaultdict(int)
for r in rencana:
    per_hari[r["wib"][:6]] += 1
print(f"\nrencana: {len(rencana)} jadwal, {PER_HARI} per hari")
print("   contoh 8 hari pertama:", dict(list(sorted(per_hari.items()))[:8]))
jitter = sorted({r["wib"][-5:] for r in rencana})
print(f"   variasi menit yang muncul: {len(jitter)} nilai berbeda (bukti jam tidak seragam)")

# pemeriksa pembuka berulang
pembuka = defaultdict(int)
for r in rencana:
    p = " ".join(r["desc"].split()[:4]).lower()
    if p:
        pembuka[p] += 1
ulang = {k: v for k, v in pembuka.items() if v > 1}
print(f"\n   pembuka yang berulang: {len(ulang)}")
for k, v in sorted(ulang.items(), key=lambda x: -x[1])[:6]:
    print(f"      {v}x «{k[:60]}»")

if "--apply" not in sys.argv:
    print("\n(dry run — pakai --apply)")
    json.dump([{k: (str(v) if hasattr(v, "isoformat") else v) for k, v in r.items()} for r in rencana],
              open(f"{WS}/drafts/threads_ritme_rencana.json", "w"), indent=1, ensure_ascii=False)
    sys.exit(0)

print("\n=== menerapkan ===")
ok = gagal = 0
for n, r in enumerate(rencana, 1):
    try:
        asli = client.get_schedule(r["id"])
        badan = dict(asli)
        badan["scheduleAt"] = r["slot"]
        for k in ("_id", "id", "createdAt", "updatedAt", "__v"):
            badan.pop(k, None)
        client._request("PUT", f"/public/schedule/{r['id']}", badan)
        cek = client.get_schedule(r["id"])
        benar = str(cek.get("scheduleAt", ""))[:16] == r["slot"][:16]
        ok += 1 if benar else 0
        gagal += 0 if benar else 1
    except Exception as e:
        gagal += 1
        print(f"   ❌ {str(e)[:60]}")
    if n % 20 == 0 or n == len(rencana):
        print(f"   {n}/{len(rencana)} | berhasil {ok} | gagal {gagal}")
print(f"\nselesai: berhasil {ok} | gagal {gagal}")
