#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""swap_albums_colors.py — ganti media 14 album carousel StudioSoft di Threads (pending)
dari desain lama (ss_opt_NN_XX.jpg) ke desain BARU (ss_opt2_NN_XX.jpg):
layout standar baru + background BIRU TUA #122B63 (album putih: bg putih + teks #122B63).

Perintah Bos 16 Sep 2026. Default DRY RUN; pakai --apply.
"""
import os
import re
import subprocess
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from PIL import Image
from repliz_client import ReplizClient, ACC, IMG_BASE_URL, IMG_DIR

WS = os.path.dirname(os.path.abspath(__file__))
SRC_DIR = os.path.join(WS, "studiosoft_albums_fixed")
INGRESS = ["103.84.155.153", "103.84.155.217"]


def fetch_all(c):
    docs, page = [], 1
    while True:
        r = c.get_schedules(page=page, limit=100)
        d = r.get("docs") or r.get("data") or []
        docs += d
        if not d or page >= (r.get("totalPages") or 1):
            break
        page += 1
    return docs


def verify(url):
    for ip in INGRESS:
        r = subprocess.run(
            ["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "30",
             "--resolve", "mantapserver.tail3947bb.ts.net:443:%s" % ip, url],
            capture_output=True, text=True)
        code = r.stdout.strip()
        print("      %s: %s" % (ip, code))
        if code != "200":
            return False
    return True


def make_jpg(num, idx, max_kb=120, quality=82):
    src = os.path.join(SRC_DIR, "ss_opt2_%s_%02d.png" % (num, idx))
    if not os.path.exists(src):
        return None
    name = "ss_opt2_%s_%02d.jpg" % (num, idx)
    dst = os.path.join(IMG_DIR, name)
    img = Image.open(src).convert("RGB")
    q = quality
    while q >= 55:
        img.save(dst, format="JPEG", quality=q, optimize=True, progressive=True)
        if os.path.getsize(dst) <= max_kb * 1024 or q <= 55:
            break
        q -= 7
    return dst


def new_name(old):
    m = re.match(r"ss_opt_(\d+)_(\d+)\.jpg$", old)
    if not m:
        return None
    return "ss_opt2_%s_%s.jpg" % (m.group(1), m.group(2))


def main():
    apply = "--apply" in sys.argv
    c = ReplizClient()
    docs = fetch_all(c)

    targets = []
    for d in docs:
        if d.get("accountId") != ACC.STUDIOSOFT_THREADS:
            continue
        if (d.get("status") or "").lower() != "pending":
            continue
        medias = d.get("medias") or []
        names = [m.get("url", "").rsplit("/", 1)[-1].split("?")[0] for m in medias]
        if not names or not all(re.match(r"ss_opt_\d+_\d+\.jpg$", n) for n in names):
            continue
        targets.append((d, names))

    print("Jadwal album Threads SS (pending) yang bisa diswap: %d" % len(targets))

    ready = []
    for d, names in targets:
        news = [new_name(n) for n in names]
        urls = []
        for n in news:
            m = re.match(r"ss_opt2_(\d+)_(\d+)\.jpg", n)
            if not m or not make_jpg(m.group(1), int(m.group(2))):
                urls = None
                break
            urls.append("%s/openclaw-img/%s" % (IMG_BASE_URL, n))
        if urls:
            ready.append((d, names, news, urls))
        else:
            print("  ⚠️ skip %s — file sumber kurang (%s)" % (d.get("scheduleAt"), ", ".join(news)))

    print("\n── verifikasi URL baru di kedua ingress ──")
    for d, names, news, urls in ready:
        print("  %s → %s" % (d.get("scheduleAt"), ", ".join(news)))
        if not verify(urls[0]):
            print("❌ %s tidak 200 — STOP" % urls[0])
            return 1

    if not apply:
        print("\n🧪 DRY RUN — %d jadwal album siap. Tambahkan --apply untuk PUT." % len(ready))
        return 0

    print("\n── PUT media ke %d jadwal ──" % len(ready))
    for d, names, news, urls in ready:
        medias = [{"type": "image", "url": u, "alt": os.path.basename(u)} for u in urls]
        payload = {
            "accountId": d.get("accountId"),
            "title": d.get("title") or "",
            "description": d.get("description") or "",
            "topic": d.get("topic") or "",
            "type": d.get("type") or "album",
            "medias": medias,
            "scheduleAt": d.get("scheduleAt"),
            "replies": d.get("replies") or [],
        }
        try:
            c._request("PUT", "/public/schedule/%s" % d["_id"], payload)
            print("  ✅ %s → %s" % (d.get("scheduleAt"), ", ".join(news)))
        except Exception as e:
            print("  ❌ %s: %s" % (d.get("scheduleAt"), str(e)[:140]))

    print("\n── verifikasi ULANG dari API ──")
    docs2 = {x.get("_id"): x for x in fetch_all(c)}
    good = 0
    for d, names, news, urls in ready:
        x = docs2.get(d["_id"]) or {}
        got = [m.get("url", "").rsplit("/", 1)[-1] for m in (x.get("medias") or [])]
        g = got == news
        good += bool(g)
        if not g:
            print("  ⚠️ %s status=%s media=%s" % (x.get("scheduleAt"), x.get("status"), got))
    print("\n%d/%d jadwal album terverifikasi memakai desain baru." % (good, len(ready)))
    return 0 if good == len(ready) else 1


if __name__ == "__main__":
    sys.exit(main())
