#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""ritme_warna_ss.py — CEK WARNA POST SEBELUMNYA di feed IG StudioSoft sebelum bikin post berikutnya.

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

Aturan: tiap post feed IG StudioSoft — carousel 08:30 · reel 11:00 · reel 19:00 — harus SELANG-SELING.
Warna post berikutnya = KEBALIKAN dari post tepat sebelumnya. Urutan slot dalam rantai:

    … → 19:00 hari sebelumnya → 08:30 → 11:00 → 19:00 → 08:30 besok → …

Kalau slot tepat sebelumnya BELUM ada di jadwal (rantai bolong), skrip jatuh ke patokan tanggal
(`ss_carousel_lib.warna_ke`) dan menandai slot yang bolong itu supaya dilengkapi.

Warna dibaca dari kenyataan:
  • reel 11:00 / 19:00  → nama file `ss_reel_biru_NN.mp4` / `ss_reel_putih_NN.mp4`
  • carousel 08:30      → piksel sudut slide 1 (>=235 = putih, selain itu biru)

Pakai:
  python3 ritme_warna_ss.py                              # rantai 6 hari ke belakang & ke depan + verdict
  python3 ritme_warna_ss.py --tgl 2026-10-06 --jam 8     # warna WAJIB untuk slot itu (dipakai cron)
  python3 ritme_warna_ss.py --tgl 2026-10-06 --jam 11
Read-only (tidak pernah menulis ke API).
"""
import argparse
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$")
URUTAN = {8: 1, 11: 2, 19: 3}          # 08:30 = urutan 1, 11:00 = 2, 19:00 = 3
JAM = {8: 30, 11: 0, 19: 0}


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 warna_album(nama):
    """putih/biru dari piksel sudut slide 1 (file lokal di openclaw-img)."""
    p = os.path.join(IMG, nama or "")
    try:
        from PIL import Image
        px = Image.open(p).convert("RGB").getpixel((8, 8))
        return "putih" if min(px) >= 235 else "biru"
    except Exception:
        return None


def rantai_feed():
    """Semua post FEED IG SS kronologis: {(tgl, jam): (dt, jenis, warna, status, id, nama)}."""
    c = get_client()
    docs = [d for d in semua(c) if d.get("accountId") == IG_SS]
    out = {}
    urut = []
    for d in docs:
        try:
            dt = datetime.datetime.fromisoformat(
                str(d.get("scheduleAt") or "").replace("Z", "+00:00")).astimezone(WIB)
        except Exception:
            continue
        tipe = str(d.get("type") or "").lower()
        med = [(x.get("url") or "").split("/")[-1] for x in (d.get("medias") or [])]
        nama = med[0] if med else ""
        if tipe == "video" and dt.hour in (11, 19):
            mm = RE_VID.search(nama)
            jenis, w = "reel", (mm.group(1) if mm else None)
        elif tipe == "album" and dt.hour == 8:
            jenis, w = "carousel", warna_album(nama)
        else:
            continue
        ent = (dt, jenis, w, str(d.get("status") or ""), d.get("_id"), nama)
        out[(dt.date(), dt.hour)] = ent
        urut.append(ent)
    urut.sort(key=lambda x: x[0])
    return out, urut


def pred(tgl, jam):
    """Slot tepat sebelum (tgl, jam) dalam rantai feed."""
    if jam == 8:
        return tgl - datetime.timedelta(days=1), 19
    return tgl, (8 if jam == 11 else 11)


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--tgl", help="YYYY-MM-DD (slot yang mau dicek)")
    ap.add_argument("--jam", type=int, choices=[8, 11, 19], default=None)
    ap.add_argument("--hari", type=int, default=6, help="rentang tampil (hari)")
    a = ap.parse_args()

    peta, urut = rantai_feed()
    print(f"rantai post FEED IG StudioSoft: {len(urut)} entri "
          f"({urut[0][0]:%d %b %Y} … {urut[-1][0]:%d %b %Y})\n")

    if a.tgl and a.jam:
        tgl = datetime.date.fromisoformat(a.tgl)
        patokan = L.warna_ke(tgl, URUTAN[a.jam])
        pt, pj = pred(tgl, a.jam)
        sbl = peta.get((pt, pj))
        ada = peta.get((tgl, a.jam))
        print(f"slot   : {tgl:%d %b %Y} {a.jam:02d}:{JAM[a.jam]:02d} WIB (urutan {URUTAN[a.jam]} hari itu)")
        if sbl and sbl[2]:
            wajib = "biru" if sbl[2] == "putih" else "putih"
            print(f"sebelum: {sbl[0]:%d %b %H:%M} WIB {sbl[1]} {sbl[2].upper()} ({sbl[3]}) — {sbl[5]}")
            print(f"→ warna WAJIB (kebalikan post sebelumnya): {wajib.upper()}")
        else:
            wajib = patokan
            print(f"sebelum: ⚠️ slot {pt:%d %b} {pj:02d}:{JAM[pj]:02d} WIB BELUM ada di jadwal "
                  f"(rantai bolong) → slot itu wajib dilengkapi")
            print(f"→ warna WAJIB (patokan tanggal, karena slot sebelumnya bolong): {wajib.upper()}")
        if ada:
            print(f"slot ini: SUDAH ada — {ada[1]} {str(ada[2]).upper()} ({ada[3]}) {ada[5]} "
                  f"→ {'✅ sesuai' if ada[2] == wajib else '❌ TIDAK sesuai, harus ' + wajib.upper()}")
        else:
            print("slot ini: belum ada jadwal — warna yang dipakai harus "
                  f"{wajib.upper()}")
        print(f"patokan tanggal (warna_ke): {patokan.upper()} "
              f"→ {'✅ cocok dengan cek rantai' if wajib == patokan else '⚠️ BEDA — pakai cek rantai (kebalikan post sebelumnya)'}")
        return

    t0 = (datetime.datetime.now(WIB) - datetime.timedelta(days=a.hari)).date()
    t1 = (datetime.datetime.now(WIB) + datetime.timedelta(days=a.hari)).date()
    prev = None
    for dt, jenis, w, st, idd, nama in urut:
        if not (t0 <= dt.date() <= t1):
            continue
        pat = L.warna_ke(dt.date(), URUTAN[dt.hour])
        tanda = "❔" if w is None else ("✅" if w == pat else "❌patokan-beda")
        if prev and w and prev[2] and w == prev[2]:
            tanda += " ⚠️KEMBAR dengan " + prev[0].strftime("%d %b %H:%M")
        if prev is None or (prev[0].date(), prev[0].hour) != pred(dt.date(), dt.hour):
            tanda += " ⚠️rantai bolong sebelum slot ini"
        print(f"{dt:%d %b %H:%M} WIB | {jenis:8s} | {str(w):5s} | patokan {pat:5s} | {st:8s} | "
              f"{idd[-6:]} | {nama} {tanda}")
        if w:
            prev = (dt, jenis, w)


if __name__ == "__main__":
    main()
