#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Pasang carousel 3 slide The Skin Code ke semua kanal (IG, Threads, FB, LinkedIn).

Pakai:
    python3 pasang_car3_tsc.py <topik> <tanggal> [--run]
    contoh: python3 pasang_car3_tsc.py bekas-jerawat-cekung 2026-10-15 --run

Jam tayang tetap 17:00 WIB (10:00 UTC). Idempoten: kalau jadwal dengan berkas media
yang sama sudah ada di akun itu, dilewati. LinkedIn tidak bisa carousel lewat Repliz
(butuh berkas dokumen), jadi slide 1 dikirim sebagai gambar tunggal.
"""
import datetime as dt
import importlib
import re
import json
import os
import shutil
import sys
import urllib.request

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

BASE_URL = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
JAM_WIB = 17

IG = "6a86a7e062caae1e04ff8244"
THREADS = "6a4bbc5920e4f4f195e52960"
FB = "6a3b41ddc5ff4ce3a327542c"
LINKEDIN = "6a4da7f520e4f4f195e796e1"

AKUN = [
    (IG, "IG", "album", "caption_ig"),
    (THREADS, "Threads", "album", "caption_threads"),
    (FB, "FB", "album", "caption_ig"),
    (LINKEDIN, "LinkedIn", "image", "caption_linkedin"),
]

MEDIA_DIR = f"{WS}/openclaw-img"


def muat_topik(nama):
    """Ambil berkas slide dari folder topik (slide 1-3 + versi LinkedIn tanpa ajakan geser)."""
    jalur = f"{WS}/tsc_car3/{nama}"
    if not os.path.isdir(jalur):
        sys.exit(f"✗ folder slide tidak ada: {jalur}")
    slides = [f"{jalur}/slide_{i}.jpg" for i in (1, 2, 3)]
    kurang = [p for p in slides if not os.path.exists(p)]
    if kurang:
        sys.exit(f"✗ slide tidak lengkap: {kurang}")
    li = f"{jalur}/slide_1_linkedin.jpg"
    return jalur, slides, (li if os.path.exists(li) else slides[0])


def salin_media(topik, slides, kode, slide_linkedin):
    """Salin slide ke openclaw-img (kalau belum ada) dan kembalikan URL publiknya."""
    urls = []
    for i, p in enumerate(slides, 1):
        nama = f"tsc_car3_{kode}_{i:02d}.jpg"
        tujuan = f"{MEDIA_DIR}/{nama}"
        if os.path.exists(tujuan):
            shutil.copy2(p, tujuan)          # segarkan kalau desainnya diperbarui
        else:
            shutil.copy2(p, tujuan)
            print(f"   + salin {nama}")
        urls.append(BASE_URL + nama)
    nama_li = f"tsc_car3_{kode}_linkedin.jpg"
    shutil.copy2(slide_linkedin, f"{MEDIA_DIR}/{nama_li}")
    return urls, BASE_URL + nama_li


def cek_url(url):
    req = urllib.request.Request(url, method="HEAD")
    with urllib.request.urlopen(req, timeout=40) as r:
        return r.status


def jadwal_ada(c, akun, nama_berkas):
    """Cek apakah akun itu sudah punya jadwal dengan berkas media tsb."""
    page = 1
    while page <= 40:
        d = c.get_schedules(page=page, limit=50)
        items = d.get("docs") or d.get("data") or d.get("items") or []
        if not items:
            break
        for it in items:
            if it.get("accountId") != akun:
                continue
            med = it.get("medias") or []
            if isinstance(med, dict):
                med = [med]
            for m in med:
                if nama_berkas in (m.get("url") or ""):
                    return it
        if len(items) < 50:
            break
        page += 1
    return None


def main():
    if len(sys.argv) < 3:
        sys.exit(__doc__)
    topik, tanggal = sys.argv[1], sys.argv[2]
    mode = "run" if "--run" in sys.argv else "dry"

    modul = None
    kandidat_modul = [topik.replace("-", "_"), topik.replace("-", ""), topik]
    m = re.match(r"tsc-topic-(\d+)$", topik)
    if m:
        kandidat_modul.insert(0, f"tsc_topik{m.group(1)}")
    for nama_modul in kandidat_modul:
        try:
            modul = importlib.import_module(nama_modul)
            break
        except ModuleNotFoundError:
            continue
    if modul is None:
        sys.exit(f"✗ modul topik tidak ditemukan untuk {topik}")
    data = modul.CAROUSEL[topik]
    kode = data["kode"]

    jalur, slides, slide_linkedin = muat_topik(topik)
    print(f"topik   : {topik} ({kode}) | {len(slides)} slide")
    urls, url_linkedin = salin_media(topik, slides, kode, slide_linkedin)
    for u in urls + [url_linkedin]:
        print(f"   HTTP {cek_url(u)}  {u.split('/')[-1]}")

    # 17:00 WIB = 10:00 UTC
    at = f"{tanggal}T{JAM_WIB - 7:02d}:00:00.000Z"
    print(f"jadwal  : {tanggal} {JAM_WIB:02d}:00 WIB ({at}) | mode: {mode}\n")

    c = get_client()
    ringkas = []
    for akun, label, tipe, kunci_caption in AKUN:
        caption = data[kunci_caption]
        if label == "Threads" and len(caption) > 500:
            sys.exit(f"✗ caption Threads {len(caption)} char (>500)")
        media = [{"url": u, "type": "image", "alt": f"{kode} slide {i}"} for i, u in enumerate(urls, 1)]
        if tipe == "image":
            # LinkedIn: satu gambar, pakai versi cover tanpa ajakan geser
            media = [{"url": url_linkedin, "type": "image", "alt": f"{kode} cover"}]
        ada = jadwal_ada(c, akun, f"tsc_car3_{kode}_01.jpg")
        if ada and mode == "run":
            # jadwal sudah ada: pastikan medianya menunjuk berkas yang benar
            med = ada.get("medias") or []
            perlu = url_linkedin if tipe == "image" else urls[0]
            punya = [m.get("url") for m in med]
            if tipe == "image" and perlu not in punya:
                c.update_schedule(ada.get("_id"), {"medias": media})
                print(f"   ↻  {label}: media diperbarui -> {perlu.split('/')[-1]}")
                ringkas.append((label, "media diperbarui", ada.get("_id")))
                continue
            print(f"   ⏭  {label}: sudah ada jadwal ({ada.get('_id')}) — dilewati")
            ringkas.append((label, "sudah ada", ada.get("_id")))
            continue
        print(f"   {'✅' if mode == 'run' else '[DRY]'} {label:8s} {tipe:6s} {len(media)} media, caption {len(caption)} char")
        if mode != "run":
            ringkas.append((label, "dry", "-"))
            continue
        res = c.create_schedule(akun, caption, at, title=f"The Skin Code — {data['judul'].replace(chr(10), ' ')}",
                                topic=data.get("kicker", "Edukasi kulit")[:50], type_=tipe,
                                medias=media, replies=[])
        sid = res.get("scheduleId") or res.get("_id") or res.get("id")
        back = c.get_schedule(sid)
        st = back.get("status")
        jml = len(back.get("medias") or [])
        print(f"       id={sid} | status={st} | type={back.get('type')} | media={jml}")
        ringkas.append((label, st, sid))

    print("\nringkasan:")
    for label, st, sid in ringkas:
        print(f"  {label:8s} {st:10s} {sid}")


if __name__ == "__main__":
    main()
