#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — carousel 10 slide "Mitos atau Fakta? 8 anggapan hukum yang sering keliru".

Deck dibuat sendiri (gen_tslaw_slide.py + deck_tslaw_mitos10.json), aset dari Bos tidak dipakai.
Tayang **10 Okt 2026** (perintah Bos: 2 hari setelah carousel PK tayang 8 Okt):
  IG      09:00 WIB (02:00Z)  — aturan carousel = 09:00
  Threads 09:00 WIB (02:00Z)
  FB      19:30 WIB (12:30Z)
LinkedIn TSLaw TETAP SKIP (STOP sejak 10 Sep).
Poster seri lama "Penyitaan Barang" yang semula di 10 Okt sudah digeser ke 11 Okt
(geser_poster_mitos07_ke11okt.py) supaya tetap 1 post feed/hari/akun.
IDEMPOTEN: skip kalau slide pertama sudah ada di jadwal akun itu.
"""
import sys, json, re, subprocess, urllib.parse, urllib.request

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

IG = "6a76a54d62caae1e04f30968"
THREADS = "6a35f8b7c5ff4ce3a322b2ed"
FB = "6a3b41d1c5ff4ce3a32753e8"

IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
SLIDES = [f"tslaw_mitos10_{i:02d}.jpg" for i in range(1, 11)]
URLS = [IMG + f for f in SLIDES]

CAP = """Mitos atau Fakta? Ada 8 anggapan hukum yang sering dipercaya, padahal keliru. ⚖️

Kami rangkum dalam satu carousel biar gampang dibaca:

1. Perkara pidana harus dilaporkan dalam 24 jam, kalau tidak perkaranya hilang.
2. Chat WhatsApp tidak bisa dijadikan bukti di pengadilan.
3. Rekaman pembicaraan tanpa izin pasti tidak sah.
4. Pisah rumah lama otomatis dianggap bercerai.
5. Anak di bawah umur bebas dari proses hukum.
6. Karya belum didaftarkan berarti belum dilindungi hak cipta.
7. Barang belanja online cacat bukan tanggung jawab penjual.
8. Karyawan bisa diberhentikan sepihak kapan saja.

Delapannya sering bikin orang salah langkah, karena keputusan diambil berdasarkan asumsi, bukan aturan yang berlaku.

Geser slide-nya sampai habis ya, tiap slide ada bagian mitos dan faktanya.

Kalau kalian punya anggapan hukum lain yang bikin ragu, tulis di kolom komentar 👇

Butuh pendampingan hukum? Konsultasikan dengan Tito Suprianto Law Firm: https://tslaw.id

📲 WhatsApp: +62 819-0922-2026

Konten ini edukasi umum, bukan nasihat hukum untuk kasus spesifik.

#mitosataufakta #hukumpidana #hukumperdata #hakcipta #ketenagakerjaan #hukumacara #edukasihukum #tslaw"""

CAP_THREADS = """Mitos atau Fakta? Ada 8 anggapan hukum yang sering dipercaya padahal keliru. ⚖️

Dari "chat WA nggak bisa jadi bukti", "pisah rumah lama otomatis cerai", sampai "anak di bawah umur bebas dari proses hukum".

Geser slide-nya sampai habis ya.

Anggapan mana yang paling sering kamu dengar? Tulis di komentar 👇

#mitosataufakta #hukumpidana #edukasihukum #tslaw"""

JOBS = [
    ("Threads", THREADS, "2026-10-10T02:00:00.000Z", CAP_THREADS),
    ("IG",      IG,      "2026-10-10T02:00:00.000Z", CAP),
    ("FB",      FB,      "2026-10-10T12:30:00.000Z", CAP),
]
JUDUL = "TS Law — Carousel Mitos atau Fakta: 8 Anggapan Hukum"

CTA_RE = re.compile(r"komentar|diskusi|pendapat|tulis di|share|pengalaman|menurut (kamu|anda)|setuju", re.I)


def all_schedules():
    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:
            d = json.load(r)
        docs += d.get("docs", d.get("data", []))
        if not d.get("hasNextPage") or not docs:
            break
        page += 1
    return docs


assert len(CAP) <= 2200, f"caption kepanjangan: {len(CAP)}"
assert len(CAP_THREADS) <= 500, f"caption Threads {len(CAP_THREADS)} > 500"
for label, cap in (("full", CAP), ("threads", CAP_THREADS)):
    assert "@" not in cap, f"ada mention di caption {label}"
    tail = cap[-160:] if label == "threads" else cap[-600:]
    assert CTA_RE.search(tail), f"ajakan komentar hilang di ekor caption {label}"
    big = [t for t in re.findall(r"#(\w+)", cap) if t != t.lower()]
    assert not big, f"hashtag huruf besar di {label}: {big}"
    assert not re.search(r"[\u3000-\u9fff\uac00-\ud7af]", cap), f"teks CJK di {label}"
print(f"caption: full {len(CAP)} char · Threads {len(CAP_THREADS)} char · CTA+hashtag+CJK OK")

bad = []
for fn, u in zip(SLIDES, URLS):
    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", "40", "-I"] + extra + [u], capture_output=True, text=True)
        codes.append(r.stdout.strip())
    if any(c != "200" for c in codes):
        bad.append((fn, codes))
print("media 10 slide:", "SEMUA 200 (3 jalur)" if not bad else f"GAGAL {bad}")
if bad:
    sys.exit("MEDIA TIDAK 200 -> batal")

existing = all_schedules()
ok, created = 0, []
for label, acc, at, cap in JOBS:
    bentrok = [s for s in existing if s.get("accountId") == acc and s.get("scheduleAt") == at]
    if bentrok:
        print(f"SKIP {label}: slot {at} sudah terisi ({(bentrok[0].get('medias') or [{}])[0].get('url','')})")
        continue
    already = [s for s in existing if s.get("accountId") == acc and SLIDES[0].lower() in json.dumps(s).lower()]
    if already:
        print(f"SKIP {label}: {SLIDES[0]} sudah ada di jadwal akun ini")
        continue
    payload = {
        "accountId": acc,
        "title": JUDUL,
        "description": cap,
        "topic": "Edukasi Hukum",
        "type": "album",
        "medias": [{"url": u, "type": "image", "alt": f[:-4]} for u, f in zip(URLS, SLIDES)],
        "scheduleAt": at,
        "replies": [],
    }
    req = urllib.request.Request(f"{BASE}/public/schedule", data=json.dumps(payload).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"})
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            res = json.load(r)
        sid = res.get("scheduleId") or res.get("_id") or res.get("id")
        print(f"OK {label} | {at} | album {len(SLIDES)} slide | caption {len(cap)} char | id={sid}")
        created.append({"label": label, "id": sid})
        ok += 1
    except Exception as e:
        body = getattr(e, "read", lambda: b"")()
        print(f"GAGAL {label}: {e} {body[:300]}")

print(f"\n{ok} jadwal dibuat")
json.dump(created, open("/tmp/tslaw_mitos10_ids.json", "w"))
