#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""audit_ritme_warna_ss.py — audit RITME WARNA feed IG StudioSoft (carousel 08:30 + reel 11:00 + reel 19:00).

Perintah Bos 3 Okt 2026: "Iya selang seling terus. Cek dulu sebelumnya warna apa harus beda.
Baik itu feed maupun reels."

Yang diperiksa:
  1. Urutan warna semua post feed IG SS (album 08:30, video 11:00, video 19:00) secara KRONOLOGIS.
  2. Warna dihitung dari kenyataan: video dari nama file (ss_reel_biru/putih_NN.mp4),
     album dari piksel sudut slide 1 (>=235 = putih, selain itu biru).
  3. Bandingkan dengan patokan `ss_carousel_lib.warna_ke(tgl, urutan)` (1 = 08:30, 2 = 11:00, 3 = 19:00).
  4. Cari DUA POST BERURUTAN DENGAN WARNA SAMA (itu yang Bos larang) dan slot kosong yang memutus rantai.

Read-only, tidak pernah menulis ke API.
"""
import datetime
import os
import re
import sys
import time

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
IMG = f"{WS}/openclaw-img"
sys.path.insert(0, WS)
from repliz_client import get_client  # noqa: E402
import ss_carousel_lib as L  # noqa: E402

IG_SS = "6a38ac33c5ff4ce3a3231232"
WIB = datetime.timezone(datetime.timedelta(hours=7))
RE_VID = re.compile(r"ss_reel_(putih|biru)_\d\d\.mp4$")
RE_CAR = re.compile(r"^(ss_car10_[a-z0-9]+)_01\.jpg$")


def putih_dari_file(path):
    try:
        from PIL import Image
        im = Image.open(path).convert("RGB")
        px = im.getpixel((8, 8))
        return "putih" if px[0] >= 235 and px[1] >= 235 and px[2] >= 235 else "biru", px
    except Exception as e:
        return None, str(e)


def semua(c):
    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(4 + 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
    return docs


def nama_media(d):
    m = d.get("medias") or []
    return [(x.get("url") or "").split("/")[-1] for x in m]


def main():
    arg = set(sys.argv[1:])
    mulai = datetime.date(2026, 10, 1)
    if "--mulai" in sys.argv:
        mulai = datetime.date.fromisoformat(sys.argv[sys.argv.index("--mulai") + 1])
    sampai = datetime.date(2026, 11, 2)
    if "--sampai" in sys.argv:
        sampai = datetime.date.fromisoformat(sys.argv[sys.argv.index("--sampai") + 1])

    c = get_client()
    docs = [d for d in semua(c) if d.get("accountId") == IG_SS]
    print(f"jadwal akun IG SS (6a38ac33…): {len(docs)}")

    per_hari = {}
    for d in docs:
        sa = str(d.get("scheduleAt") or "")
        try:
            dt = datetime.datetime.fromisoformat(sa.replace("Z", "+00:00")).astimezone(WIB)
        except Exception:
            continue
        per_hari.setdefault(dt.date(), []).append((dt, d))

    baris = []           # (tgl, jam, tipe, warna, status, id, nama)
    catatan = []
    for tgl in sorted(per_hari):
        for dt, d in sorted(per_hari[tgl]):
            tipe = str(d.get("type") or "").lower()
            nama = nama_media(d)
            w = None
            if tipe == "video" and dt.hour in (11, 19) and dt.minute == 0:
                mm = RE_VID.search(nama[0] if nama else "")
                w = mm.group(1) if mm else None
                baris.append((dt, "reel", w, d.get("status"), d["_id"], nama[0] if nama else "?"))
            elif tipe == "album" and dt.hour == 8 and dt.minute == 30:
                f = os.path.join(IMG, nama[0]) if nama else ""
                w, px = putih_dari_file(f)
                baris.append((dt, "carousel", w, d.get("status"), d["_id"], nama[0] if nama else "?"))
                if w is None:
                    catatan.append(f"{dt:%d %b} carousel: gagal baca piksel ({px})")

    print("\n=== urutan warna post FEED IG SS (kronologis) ===")
    rusak, hilang = [], []
    prev = None
    for dt, jenis, w, st, idd, nm in baris:
        exp = L.warna_ke(dt.date(), {8: 1, 11: 2, 19: 3}[dt.hour])
        tanda = "✅"
        if w is None:
            tanda = "❔"
        elif w != exp:
            tanda = "❌BEDA-PATOKAN"
        sd = ""
        if prev is not None and w and prev[1] and w == prev[1]:
            tanda += " ⚠️KEMBAR"
            rusak.append((dt, jenis, w, prev[0]))
        print(f"{dt:%d %b %H:%M} WIB | {jenis:8s} | {str(w):5s} | patokan {exp:5s} | "
              f"{str(st):8s} | {idd[-6:]} | {nm} {tanda}")
        if w:
            prev = (dt, w)

    print("\n=== ringkasan ===")
    if rusak:
        print("⚠️ dua post berurutan BERWARNA SAMA:")
        for dt, jenis, w, sebelum in rusak:
            print(f"   {dt:%d %b %H:%M} {jenis} {w} — sama dengan {sebelum:%d %b %H:%M}")
    else:
        print("✅ tidak ada dua post berurutan berwarna sama (selang-seling murni)")

    # slot feed yang kosong (memutus rantai)
    hari_ada = {}
    for dt, jenis, w, st, idd, nm in baris:
        hari_ada.setdefault(dt.date(), set()).add(dt.hour)
    print("\nslot feed kosong (belum ada jadwal) 3-31 Okt:")
    ada_kosong = False
    d = max(mulai, datetime.datetime.now(WIB).date())
    while d <= sampai:
        kurang = [f"{h:02d}:{m:02d}" for h, m in [(8, 30), (11, 0), (19, 0)]
                  if h not in hari_ada.get(d, set())]
        if kurang:
            ada_kosong = True
            print(f"   {d:%d %b} (urutan 1 seharusnya {L.warna_ke(d,1)}) → kosong: {', '.join(kurang)}")
        d += datetime.timedelta(days=1)
    if not ada_kosong:
        print("   (tidak ada — semua slot terisi)")
    for cc in catatan:
        print("   ℹ️", cc)


if __name__ == "__main__":
    main()
