#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — pasang ulang 2 konten IG yang gagal tayang 16 Okt 2026.

Sebab gagal: media server (mantapserver.tail3947bb.ts.net) balas 503 saat Repliz
mengunduh berkas, jadi Instagram menolak. Berkasnya utuh, URL sekarang 200.

Rencana (WIB):
  Selasa 20 Okt 11:00  IG  video/reel  Pasal 411 KUHP   (slot feed, hari itu kosong)
  Selasa 20 Okt 20:00  IG  story       "Reputasi online juga punya dampak hukum"

Caption diambil ulang dari jadwal lama (bukan diketik ulang) supaya teksnya sama.

Pakai: python3 pasang_ulang_tslaw_18okt.py         (dry run)
       python3 pasang_ulang_tslaw_18okt.py --run   (eksekusi)
"""
import json
import re
import subprocess
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

IG = "6a76a54d62caae1e04f30968"
IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
FN_VIDEO = "tslaw_video_pasal411_1016_4k_h264.mp4"
FN_STORY = "tslaw_story_13.mp4"
LAMA_VIDEO = "6ace0b53c8961f9c338ea5f0"
LAMA_STORY = "6ac1088307008e0e919f9265"
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]")


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


def cek_media(url):
    codes = []
    for extra in ([], ["--resolve", "mantapserver.tail3947bb.ts.net:443:103.84.155.153"],
                  ["--resolve", "mantapserver.tail3947bb.ts.net:443:103.84.155.217"]):
        r = subprocess.run(["curl", "-4", "-s", "-o", "/dev/null", "-w", "%{http_code}",
                            "--max-time", "60", "-I"] + extra + [url],
                           capture_output=True, text=True)
        codes.append(r.stdout.strip())
    return codes


cl = get_client()

# ── 1) ambil naskah asli dari jadwal yang gagal ──
vid_lama = cl.get_schedule(LAMA_VIDEO)
CAP = vid_lama.get("description") or ""
JUDUL = vid_lama.get("title") or "TS Law — Pasal 411 KUHP: Perselingkuhan dan Risiko Sebar Bukti"
TOPIC = vid_lama.get("topic") or "Edukasi Hukum"
assert len(CAP) <= 2200, f"caption {len(CAP)} char > 2200"
assert "@" not in CAP, "ada mention di caption"
big = [t for t in re.findall(r"#(\w+)", CAP) if t != t.lower()]
assert not big, f"hashtag huruf besar: {big}"
assert not CJK_RE.search(CAP), "teks CJK di caption"
print(f"caption dari jadwal lama: {len(CAP)} char · judul: {JUDUL[:50]}")

# ── 2) media harus 200 di tiga jalur ──
for fn in (FN_VIDEO, FN_STORY):
    codes = cek_media(IMG + fn)
    print(f"media HEAD {fn}: {codes}")
    if any(c != "200" for c in codes):
        sys.exit(f"❌ {fn} tidak 200 di semua jalur {codes} → batal")

# ── 3) cek bentrok slot ──
jadwal = semua_jadwal()
ig = [s for s in jadwal if str(s.get("accountId")) == IG]
bentrok = [s for s in ig if str(s.get("scheduleAt", "")).startswith(("2026-10-20T04:00", "2026-10-20T13:00"))]
for s in bentrok:
    print("slot terpakai:", s.get("scheduleAt"), s.get("type"), s.get("status"),
          str((s.get("medias") or [{}])[0].get("url", "")).split("/")[-1])
if bentrok:
    sys.exit("❌ slot 20 Okt 11:00 / 20:00 WIB sudah terpakai → batal")

# ── 4) idempoten: jangan dobel kalau sudah pernah dipasang ──
def sudah_ada(fn):
    for s in ig:
        if fn.lower() in json.dumps(s).lower() and s.get("status") != "error":
            return s
    return None


JOBS = [
    ("IG reel", IG, "2026-10-20T04:00:00.000Z", "video", FN_VIDEO, CAP, JUDUL, TOPIC),
    ("IG story", IG, "2026-10-20T13:00:00.000Z", "story", FN_STORY, "",
     "Story TS Law tslaw_story_13.mp4", "Story harian TS Law (video slides konten lama)"),
]

for label, acc, at, typ, fn, teks, judul, topic in JOBS:
    ada = sudah_ada(fn)
    if ada:
        print(f"⏭️  {label}: {fn} sudah ada (id {ada.get('_id')}, {ada.get('scheduleAt')}, {ada.get('status')}) → SKIP")
        continue
    medias = [{"url": IMG + fn, "type": "video", "alt": fn[:-4] if typ == "video" else fn}]
    print(f"{'✅' if MODE == 'run' else '[DRY]'} {label} | {at} | {typ} | {fn} | caption {len(teks)} char")
    if MODE != "run":
        continue
    res = cl.create_schedule(acc, teks, at, title=judul, topic=topic, type_=typ, medias=medias, replies=[])
    sid = res.get("scheduleId") or res.get("_id") or res.get("id")
    back = cl.get_schedule(sid)
    bm = (back.get("medias") or [{}])[0]
    print(f"   dibuat id={sid}")
    print(f"   baca-balik: status={back.get('status')} type={back.get('type')} "
          f"scheduleAt={back.get('scheduleAt')} caption={len(back.get('description') or '')} char "
          f"media={str(bm.get('url', '')).split('/')[-1]} replies={back.get('replies')}")
