#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Pasang carousel Threads @ukyhandoko gaya template "White & Black Simple Carousel".

Pakai:
  python3 pasang_carousel_uky.py media [--src /tmp/uky_car] [--prefix uky_car_]
  python3 pasang_carousel_uky.py run --tgl 2026-10-11
"""
import os, sys, re, json, shutil, argparse, subprocess, urllib.parse, urllib.request, time

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

UKY = "6a334e89c5ff4ce3a3225a48"
IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
INGRESS = ["103.84.155.153", "103.84.155.217"]

CAP = """Bisnis kecil tumbuh bukan karena iklan besar, tapi karena 5 kebiasaan ini. ⚙️

Jualan pakai cerita · catat angkanya · tampil teratur · pilih satu kanal · minta umpan balik.

Geser slide-nya sampai habis ya. Kalau mau, simpan dulu buat nanti.

Dari lima ini, mana yang paling sering kamu lewatkan? Tulis di komentar 👇

#bisnisdigital #umkm #personalbranding #studiosoft"""

ap = argparse.ArgumentParser()
ap.add_argument("mode", choices=["media", "run"])
ap.add_argument("--src", default="/tmp/uky_car")
ap.add_argument("--prefix", default="uky_car_")
ap.add_argument("--tgl", default="2026-10-11")
ap.add_argument("--judul", default="uky — 5 Kebiasaan Bisnis Kecil Tumbuh (carousel baru)")
ap.add_argument("--topik", default="Bisnis & Strategi")
ap.add_argument("--jumlah", type=int, default=7)
a = ap.parse_args()

SLIDES = [f"{a.prefix}{i:02d}.jpg" for i in range(1, a.jumlah + 1)]
URLS = [IMG + f for f in SLIDES]
CTA_RE = re.compile(r"komentar|tulis di|menurut kamu|setuju|pendapat", re.I)
CJK = re.compile(r"[\u3000-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]")


def gate(url):
    out = {}
    for label, extra in (("lokal", []), *[(ip, ["--resolve", f"mantapserver.tail3947bb.ts.net:443:{ip}"]) for ip in INGRESS]):
        p = subprocess.run(["curl", "-4", "-s", "-o", "/dev/null", "-w", "%{http_code}",
                            "--max-time", "25", *extra, url], capture_output=True, text=True)
        out[label] = (p.stdout or "000").strip()
    return out


if a.mode == "media":
    os.makedirs("openclaw-img", exist_ok=True)
    for i in range(1, a.jumlah + 1):
        shutil.copyfile(os.path.join(a.src, f"uky_car_{i:02d}.jpg"), os.path.join("openclaw-img", SLIDES[i - 1]))
    print(f"copy {a.jumlah} file → openclaw-img/{a.prefix}*.jpg")
    gagal = 0
    for u in URLS:
        g = gate(u)
        ok = all(v == "200" for v in g.values())
        gagal += 0 if ok else 1
        print(f"  {'✅' if ok else '❌'} {u.split('/')[-1]} {g}")
    sys.exit(1 if gagal else 0)

# ── run ──
mm = []
if len(CAP) > 500:
    mm.append(f"panjang={len(CAP)}")
if not CTA_RE.search(CAP[-160:]):
    mm.append("tanpa-CTA-di-ekor")
if CJK.search(CAP):
    mm.append("CJK")
tags = re.findall(r"#(\w+)", CAP)
if any(t != t.lower() for t in tags):
    mm.append("hashtag-besar")
print(f"caption: {len(CAP)} char, {len(tags)} hashtag {'✅' if not mm else '❌ ' + ','.join(mm)}")
if mm:
    sys.exit("⛔ caption bermasalah")

y, m, d = [int(x) for x in a.tgl.split("-")]
saat = f"{y:04d}-{m:02d}-{d:02d}T02:00:00.000Z"      # 09:00 WIB

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:
        dd = json.loads(r.read().decode())
    b = dd.get("docs") or []
    docs += b
    if not b or page * 100 >= (dd.get("totalDocs") or 0):
        break
    page += 1

sudah = any(SLIDES[0] in [(mm_.get("url") or "").split("/")[-1] for mm_ in (x.get("medias") or [])]
            for x in docs if (x.get("account") or {}).get("_id") == UKY)
if sudah:
    print("⏭️  slide 01 sudah terjadwal di akun uky — skip")
    sys.exit(0)

c = get_client()
res = c.create_schedule(UKY, CAP, saat, title=a.judul, topic=a.topik,
                        type_="album", medias=[{"url": u} for u in URLS], replies=[])
sid = res.get("scheduleId") or res.get("_id") or res.get("id")
time.sleep(0.5)
b = c.get_schedule(sid)
bb = b.get("data", b) if isinstance(b, dict) else b
med = [m_.get("url", "").split("/")[-1] for m_ in (bb.get("medias") or [])]
print(f"{sid} | status={bb.get('status')} | {bb.get('scheduleAt')} | media={len(med)} | "
      f"urut={'OK' if med == SLIDES else med} | topic={bb.get('topic')}")
