#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — terbitkan ulang carousel 14 Okt (IG & Threads) ke 21 Okt 09:00 WIB.

Status jadwal lama tidak bisa direset dari "error" lewat PUT (server mempertahankan
status), jadi dibuat jadwal BARU dengan media yang sudah diperbaiki (type "image"),
lalu jadwal lama dikembalikan ke tanggal aslinya (14 Okt) sebagai catatan.

Pakai: python3 terbitkan_ulang_album_14okt.py         (dry run)
       python3 terbitkan_ulang_album_14okt.py --run
"""
import json
import re
import sys
import urllib.parse
import urllib.request

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

LAMA = {"6ac35397173307838558141e": "IG", "6ac3539707008e0e9104842f": "TH"}
TARGET = "2026-10-21T02:00:00.000Z"   # Rabu 21 Okt 09:00 WIB
ASLI = "2026-10-14T02:00:00.000Z"
MODE = "run" if "--run" in sys.argv else "dry"
CJK_RE = re.compile(r"[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af]")
cl = get_client()


def semua_jadwal():
    docs, page = [], 1
    while True:
        q = urllib.parse.urlencode({"page": page, "limit": 100})
        req = urllib.request.Request(f"{BASE}/public/schedule?{q}", headers=HEADERS)
        with urllib.request.urlopen(req, timeout=60) as r:
            d = json.load(r)
        b = d.get("docs", d.get("data", []))
        docs += b
        if not d.get("hasNextPage") or not b:
            break
        page += 1
    return docs


docs = semua_jadwal()
for sid, akun in LAMA.items():
    lama = cl.get_schedule(sid)
    cap = lama.get("description") or ""
    title = lama.get("title") or ""
    topic = lama.get("topic") or ""
    medias = [{"url": m.get("url"), "type": "image",
               "alt": str(m.get("url")).split("/")[-1].rsplit(".", 1)[0],
               "customThumbnail": False, "thumbnail": ""} for m in (lama.get("medias") or [])]
    assert medias and all(m["type"] == "image" for m in medias)
    assert not CJK_RE.search(cap), "caption ber-CJK"
    if akun == "TH":
        assert len(cap) <= 495, f"caption Threads {len(cap)} > 495"
        assert len(topic) <= 50, f"topic Threads {len(topic)} > 50"
    # jangan dobel: cek apakah sudah ada jadwal album pending di slot target
    sudah = [s for s in docs if str(s.get("accountId")) == lama.get("accountId")
             and s.get("type") == "album" and str(s.get("scheduleAt", "")).startswith(TARGET[:16])
             and s.get("status") == "pending"]
    print(f"=== {akun} | caption {len(cap)} char | topic {topic!r} | {len(medias)} slide | "
          f"slot target {'SUDAH ADA ' + str(sudah[0].get('_id')) if sudah else 'kosong'}")
    if MODE != "run":
        continue
    if sudah:
        print("   ⏭️  SKIP buat baru")
    else:
        res = cl.create_schedule(lama.get("accountId"), cap, TARGET, title=title, topic=topic,
                                 type_="album", medias=medias, replies=lama.get("replies") or [])
        baru = res.get("scheduleId") or res.get("_id")
        b = cl.get_schedule(baru)
        print(f"   dibuat id={baru} → {b.get('scheduleAt')} status={b.get('status')} "
              f"n={len(b.get('medias') or [])} types={sorted({str(m.get('type')) for m in (b.get('medias') or [])})} "
              f"caption {len(b.get('description') or '')} char")
    # kembalikan jadwal lama ke tanggal aslinya (catatan)
    if str(lama.get("scheduleAt")) != ASLI:
        cl.update_schedule(sid, {"scheduleAt": ASLI})
        b2 = cl.get_schedule(sid)
        print(f"   jadwal lama {sid} dikembalikan ke {b2.get('scheduleAt')} status={b2.get('status')}")
