#!/usr/bin/env python3
"""Pasang carousel 10 slide GEO ke feed IG StudioSoft — 1 Okt 2026, 08:30 WIB.

- PNG → JPEG q85 di openclaw-img (root server media = workspace)
- cek 200 di KEDUA ingress funnel sebelum create
- idempoten: kalau sudah ada jadwal di akun+slot itu, SKIP
- verifikasi baca balik (GET /public/schedule/<id>)
"""
import json
import os
import shutil
import sys
import urllib.request

sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import ReplizClient, ACC
from PIL import Image

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
SRC = os.path.join(WS, "ss_ig_car10_geo")
SERVE = os.path.join(WS, "openclaw-img")
BASE = "https://mantapserver.tail3947bb.ts.net"
INGRESS = ["103.84.155.153", "103.84.155.217"]
ACCOUNT = ACC.STUDIOSOFT_IG
SLOT = "2026-10-01T01:30:00.000Z"      # 1 Okt 2026 08:30 WIB
CAPTION = open("/tmp/caption_geo.txt", encoding="utf-8").read().strip()
TITLE = "Carousel IG StudioSoft — GEO: Biar Bisnis Anda Dikutip Mesin AI"
NAMES = [f"ss_car10_geo_{i:02d}.jpg" for i in range(1, 11)]


def jpegkan():
    out = []
    for i in range(1, 11):
        src = os.path.join(SRC, f"ss_car10_geo_{i:02d}.png")
        dst = os.path.join(SERVE, NAMES[i - 1])
        im = Image.open(src).convert("RGB")
        im.save(dst, "JPEG", quality=85, optimize=True)
        kb = os.path.getsize(dst) / 1024
        out.append((NAMES[i - 1], im.size, kb))
    for n, size, kb in out:
        print(f"  {n} {size[0]}x{size[1]} {kb:.0f} KB")
    return out


def cek_ingress():
    from repliz_client import ReplizClient as _C
    c = _C()
    hasil = []
    for n in NAMES:
        url = f"{BASE}/openclaw-img/{n}"
        codes = []
        for ip in INGRESS:
            cmd = ["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "25",
                   "--resolve", f"mantapserver.tail3947bb.ts.net:443:{ip}", url]
            import subprocess
            r = subprocess.run(cmd, capture_output=True, text=True)
            codes.append(r.stdout.strip())
        hasil.append((n, codes))
        print(f"  {n}: {codes}")
    return hasil


def slot_terisi(client):
    """Cek jadwal yang sudah ada di akun + slot jam yang sama (anti-dobel)."""
    docs, page = [], 1
    while True:
        r = client.get(f"/public/schedule?page={page}&limit=100")
        d = r.get("docs") or []
        docs += d
        if page >= (r.get("totalPages") or 0) or not d:
            break
        page += 1
    hari = SLOT[:10]
    ada = []
    for d in docs:
        acc = (d.get("account") or {}).get("_id") or d.get("accountId")
        if acc != ACCOUNT:
            continue
        sa = d.get("scheduleAt") or ""
        if sa[:10] == hari and sa[11:16] == "01:30":
            ada.append(d)
    return ada


if __name__ == "__main__":
    go = "--go" in sys.argv
    print("1) render JPEG ke openclaw-img")
    jpegkan()
    print("\n2) cek HTTP 200 di kedua ingress")
    hasil = cek_ingress()
    gagal = [(n, c) for n, c in hasil if any(x != "200" for x in c)]
    if gagal and "--force" not in sys.argv:
        print("  ❌ ada media yang tidak 200 di salah satu ingress → STOP:", gagal)
        sys.exit(1)
    client = ReplizClient()
    print("\n3) cek slot (anti-dobel)")
    ada = slot_terisi(client)
    if ada:
        print("  ⏭️ slot sudah terisi:", [(d["_id"], d.get("type")) for d in ada])
        sys.exit(0)
    if not go:
        print("  (dry run — tambahkan --go untuk create)")
        sys.exit(0)
    medias = [{"url": f"{BASE}/openclaw-img/{n}", "type": "image", "alt": f"GEO slide {i+1}"}
              for i, n in enumerate(NAMES)]
    print(f"\n4) create album 10 slide @ {SLOT} (1 Okt 08:30 WIB)")
    res = client.schedule_album(ACCOUNT, CAPTION, SLOT, medias, title=TITLE)
    sid = res.get("scheduleId") or res.get("_id") or res.get("id")
    print("   respons:", res)
    doc = client.get_schedule(sid) if sid else {}
    print("   baca balik:", {k: doc.get(k) for k in ("_id", "status", "scheduleAt", "type")},
          "| akun:", (doc.get("account") or {}).get("name"),
          "| media:", len(doc.get("medias") or []))
    json.dump({"id": sid, "slot": SLOT, "medias": medias, "caption": CAPTION},
              open(os.path.join(WS, "output_jadwal_car10_geo.json"), "w"),
              indent=2, ensure_ascii=False)
