#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TSC: pasang carousel Tahi Lalat (IG + Threads) + bereskan caption Threads yang >500 char.

- Tahi Lalat (dari Bos, 3 slide, label "Halaman 1 dari 3" / "3/3") → 16 Sep 2026 09:00 WIB
- Threads keringat (14 Sep) & Threads flek (15 Sep): caption >500 char → DIPENDEKKAN (kalau tidak, PASTI error saat tayang)
- Threads baukaki (13 Sep) sudah error ("Param text must be at most 500 characters long") → DELETE + CREATE ulang 17 Sep 09:00 WIB
IDEMPOTEN: skip create kalau media sudah ada di jadwal akun.
"""
import sys, os, json, re, subprocess, urllib.request
from PIL import Image

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/skills/social-media/atun-social-automation/scripts")
from repliz_client import HEADERS, BASE
from batasi_caption_threads import batasi

IG_TSC = "6a86a7e062caae1e04ff8244"
TH_TSC = "6a4bbc5920e4f4f195e52960"
IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
SRC = "/tmp/tahilalat/Tahi Lalat-2"
DST = f"{WS}/openclaw-img"
TAG = "tsc_tahilalat"
KERINGAT_TH_ID = "6aa3ad24b595e690a6d3d80a"
FLEK_TH_ID = "6aa4d878703d29cb5850a56c"
BAUKAKI_TH_ID = "6aa3a512b595e690a6d3d80a50"

CAP_IG = """Tahi lalat sering dianggap bagian alami kulit. Tapi kalau letaknya mengganggu penampilan atau terasa tidak nyaman, menghilangkannya tidak boleh asal. 🔍

KENALI PILIHAN PERAWATAN YANG TEPAT:
• Periksa terlebih dahulu untuk menentukan penanganan yang sesuai
• Hindari memotong, mengikat, atau memakai bahan rumahan
• Konsultasikan dengan tenaga profesional — langkah pertama yang benar

Setiap tahi lalat perlu dinilai secara tepat oleh tenaga profesional. Ada yang aman dibiarkan, ada juga yang perlu diwaspadai — misalnya bila berubah bentuk, warna, atau ukuran, terasa gatal, atau mudah berdarah. Karena itu penilaian medis penting, bukan hanya soal penampilan tapi juga keamanan kulit.

Keamanan kulit selalu jadi prioritas. Simpan postingan ini, lalu konsultasikan pilihan perawatannya ke klinik.

Punya pengalaman atau pertanyaan soal tahi lalat? Tulis di kolom komentar, yuk diskusi! 👇

📲 Konsultasi & booking via WhatsApp: 0851-1744-4417

#theskincodeclinic #tahilalat #dokterkulit #klinikkulit #perawatankulit #kulitsehat #kesehatankulit #estetikamedis"""

CAP_TH = """Tahi lalat sering dianggap biasa, tapi menghilangkannya jangan asal. 🔍

• Periksa dulu untuk menentukan penanganan yang sesuai
• Hindari memotong, mengikat, atau pakai bahan rumahan
• Setiap tahi lalat perlu dinilai tenaga profesional — bukan cuma soal penampilan, tapi keamanan kulit

Kalau tahi lalat berubah bentuk, warna, atau terasa gatal, sebaiknya diperiksa.

Punya pengalaman atau pertanyaan soal tahi lalat? Diskusi di komentar 👇

📲 WA: 0851-1744-4417

#theskincodeclinic #tahilalat #dokterkulit #kulitsehat"""

CAP_TH_KERINGAT = """Bau keringat muncul berulang meski sudah mandi dan pakai deodoran? 🌿

Kenali penyebabnya dulu, lalu rawat kulit dengan tepat — sering berkaitan dengan area lipatan tubuh yang lembap dan aktivitas padat.

MULAI DARI KEBIASAAN HARIAN:
1️⃣ Bersihkan area lipatan tubuh secara teratur
2️⃣ Keringkan kulit setelah mandi & setelah beraktivitas
3️⃣ Pilih produk perawatan yang sesuai kondisi kulit

Kalau terus berulang atau disertai keluhan kulit lain, konsultasikan dengan dr. Avril Novianto, Sp.D.V.E. di The Skin Code Clinic.

Pernah ngalamin? Cerita di komentar 👇

📲 WA: 0851-1744-4417

#theskincodeclinic #baukeringat #dokterkulit #kulitsehat"""

CAP_TH_FLEK = """Flek di wajah bikin nggak percaya diri? Mulai cegah dari kebiasaan sederhana ✨

1️⃣ Pakai sunscreen tiap pagi, termasuk di dalam ruangan
2️⃣ Reapply saat banyak aktivitas di luar
3️⃣ Hindari memencet jerawat & iritasi berulang

Rawat kulit dengan lembut: pilih skincare sesuai kebutuhan, jaga kelembapan, dan konsultasikan flek yang menetap.

Punya pengalaman dengan flek? Diskusi di komentar 👇

📲 WA: 0851-1744-4417

#theskincodeclinic #flek #dokterkulit #kulitsehat"""

CAP_TH_BAUKAKI = """Bau kaki bikin nggak pede, apalagi saat harus melepas sepatu? 🦶

3 KEBIASAAN YANG WAJIB DILAKUKAN:
1️⃣ Cuci kaki setiap hari dan keringkan sampai sela jari
2️⃣ Ganti kaus kaki secara rutin
3️⃣ Pilih alas kaki yang punya sirkulasi udara baik

Kaki bersih dan kering membantu menjaga kenyamanan sepanjang hari. Kalau bau kaki menetap atau disertai gatal dan perubahan kulit, konsultasikan dengan dokter kulit.

Punya tips lain? Cerita di komentar 👇

📲 WA: 0851-1744-4417

#theskincodeclinic #baukaki #dokterkulit #kulitsehat"""


def list_all():
    docs, page = [], 1
    while True:
        import urllib.parse
        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)
        docs += d.get("docs", d.get("data", []))
        if not d.get("hasNextPage") or not docs:
            break
        page += 1
    return docs


def sid_of(s):
    return s.get("_id") or s.get("id")


def cek_caption(nama, cap):
    tags = re.findall(r"#(\w+)", cap)
    assert all(t == t.lower() for t in tags), f"{nama}: hashtag huruf besar {tags}"
    assert not re.findall(r"@\w+", cap), f"{nama}: ada mention"
    assert "komentar" in cap.lower(), f"{nama}: tidak ada ajakan diskusi"
    if nama.startswith("TH"):
        assert len(cap) <= 500, f"{nama}: {len(cap)} char > 500"
    print(f"  ✔ {nama}: {len(cap)} char | hashtag lowercase | ajakan diskusi OK")


def put_caption(schedule_id, cap, label):
    docs = {sid_of(s): s for s in list_all()}
    s = docs.get(schedule_id)
    if not s:
        print(f"  ❌ {label}: jadwal {schedule_id} tidak ketemu")
        return False
    payload = {"accountId": s.get("accountId"), "title": s.get("title", ""),
               "description": cap, "topic": s.get("topic", ""), "type": s.get("type", ""),
               "medias": s.get("medias") or [], "scheduleAt": s.get("scheduleAt"),
               "replies": s.get("replies") or []}
    req = urllib.request.Request(f"{BASE}/public/schedule/{schedule_id}",
                                 data=json.dumps(payload).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"},
                                 method="PUT")
    try:
        with urllib.request.urlopen(req, timeout=40) as r:
            json.load(r)
        print(f"  ✅ PUT caption {label}: {len(cap)} char (id {schedule_id})")
        return True
    except Exception as e:
        print(f"  ❌ PUT {label} gagal: {e}")
        return False


print("== 1. Siapkan media slide (PNG → JPEG q90) ==")
for i in range(1, 4):
    im = Image.open(f"{SRC}/{i}.png").convert("RGB")
    out = f"{DST}/{TAG}_{i:02d}.jpg"
    im.save(out, "JPEG", quality=90, optimize=True)
    print(f"  {TAG}_{i:02d}.jpg  {im.size}  {os.path.getsize(out)//1024} KB")

print("\n== 2. Verifikasi media lewat 3 jalur (lokal + 2 ingress funnel) ==")
for i in range(1, 4):
    url = f"{IMG}{TAG}_{i:02d}.jpg"
    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", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "25"] + extra + [url],
                           capture_output=True, text=True)
        codes.append(r.stdout.strip())
    print(f"  {TAG}_{i:02d}.jpg → {codes} {'✅' if all(c=='200' for c in codes) else '❌ JANGAN CREATE'}")
    assert all(c == "200" for c in codes), "media tidak siap → stop"

print("\n== 3. Cek caption ==")
cek_caption("IG tahi lalat", CAP_IG)
for nm, cap in [("TH tahi lalat", CAP_TH), ("TH keringat", CAP_TH_KERINGAT),
                ("TH flek", CAP_TH_FLEK), ("TH baukaki", CAP_TH_BAUKAKI)]:
    if len(cap) > 500:
        print(f"  ⚠️ {nm} {len(cap)} char → dipangkas otomatis")
        cap = batasi(cap)
    cek_caption(nm, cap)

CAP_TH = batasi(CAP_TH) if len(CAP_TH) > 500 else CAP_TH
CAP_TH_KERINGAT = batasi(CAP_TH_KERINGAT) if len(CAP_TH_KERINGAT) > 500 else CAP_TH_KERINGAT
CAP_TH_FLEK = batasi(CAP_TH_FLEK) if len(CAP_TH_FLEK) > 500 else CAP_TH_FLEK
CAP_TH_BAUKAKI = batasi(CAP_TH_BAUKAKI) if len(CAP_TH_BAUKAKI) > 500 else CAP_TH_BAUKAKI

print("\n== 4. Create carousel Tahi Lalat (16 Sep 2026 09:00 WIB) ==")
existing = list_all()
blob = json.dumps(existing).lower()
slides = [{"url": f"{IMG}{TAG}_{i:02d}.jpg", "type": "image", "alt": f"{TAG}_{i:02d}"} for i in range(1, 4)]
for accid, nm, cap in [(IG_TSC, "IG TSC", CAP_IG), (TH_TSC, "Threads TSC", CAP_TH)]:
    if TAG in blob:
        print(f"  ⏭️  {nm}: sudah ada jadwal {TAG} → SKIP")
        continue
    payload = {"accountId": accid, "title": "The Skin Code Clinic — Carousel Solusi Menghilangkan Tahi Lalat",
               "description": cap, "topic": "Edukasi Kulit", "type": "album", "medias": slides,
               "scheduleAt": "2026-09-16T02:00:00.000Z", "replies": []}
    req = urllib.request.Request(f"{BASE}/public/schedule", data=json.dumps(payload).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=45) as r:
        res = json.load(r)
    print(f"  ✅ {nm}: id={res.get('scheduleId') or res.get('_id') or res.get('id')} | {len(cap)} char | 3 slide")

print("\n== 5. Perbaiki caption Threads yang >500 char (keringat 14 Sep, flek 15 Sep) ==")
put_caption(KERINGAT_TH_ID, CAP_TH_KERINGAT, "Threads keringat (14 Sep)")
put_caption(FLEK_TH_ID, CAP_TH_FLEK, "Threads flek (15 Sep)")

print("\n== 6. Bau Kaki Threads: hapus yang error + create ulang 17 Sep 09:00 WIB ==")
try:
    d = {sid_of(s): s for s in list_all()}
    if BAUKAKI_TH_ID in d:
        req = urllib.request.Request(f"{BASE}/public/schedule/{BAUKAKI_TH_ID}", headers=HEADERS, method="DELETE")
        with urllib.request.urlopen(req, timeout=40) as r:
            print(f"  🗑️  delete error id {BAUKAKI_TH_ID}")
    payload = {"accountId": TH_TSC, "title": "The Skin Code Clinic — Carousel Solusi Bau Kaki",
               "description": CAP_TH_BAUKAKI, "topic": "Edukasi Kulit", "type": "album",
               "medias": [{"url": f"{IMG}tsc_baukaki_{i:02d}.jpg", "type": "image", "alt": f"tsc_baukaki_{i:02d}"} for i in range(1, 4)],
               "scheduleAt": "2026-09-17T02:00:00.000Z", "replies": []}
    req = urllib.request.Request(f"{BASE}/public/schedule", data=json.dumps(payload).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=45) as r:
        res = json.load(r)
    print(f"  ✅ Threads TSC baukaki baru: id={res.get('scheduleId') or res.get('_id') or res.get('id')} | {len(CAP_TH_BAUKAKI)} char | 17 Sep 09:00 WIB")
except Exception as e:
    print(f"  ❌ baukaki: {e}")

print("\n== 7. VERIFIKASI AKHIR (dari API) ==")
for s in sorted([x for x in list_all() if x.get("accountId") in (IG_TSC, TH_TSC)
                 and x.get("type") == "album" and x.get("status") in ("pending", "draft")],
                key=lambda x: str(x.get("scheduleAt"))):
    acc = "IG    " if s.get("accountId") == IG_TSC else "Threads"
    cap = s.get("description") or ""
    med = [m["url"].rsplit("/", 1)[1] for m in (s.get("medias") or [])]
    warn = " ⚠️>500" if acc == "Threads" and len(cap) > 500 else ""
    print(f"  {acc} | {s.get('scheduleAt')} | {len(cap):4d} char{warn} | {med} | {(s.get('title') or '')[:45]}")
