#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — video "NYEBAR 'PELAKOR' BISA KENA PIDANA" (kiriman Bos 8 Okt 2026 via MEGA).

Asal: MEGA /file/KNsVARLa#... -> "1007.mp4" (HEVC 2160x3840, 34,4 dtk, 75,7 MB)
       -> transcode H.264 1080x1920 30fps AAC (openclaw-img/tslaw_video_pelakor_pencemaran_1008_h264.mp4, 14,8 MB)

Isi video (dibaca lewat OCR 2 fps + vision, bukan tebakan):
  narator perempuan, subtitle kuning:
  "cuma bilang pelakor / bisa sampai dipidana / bisa menyebut seseorang / pelakor sambil menyebar /
   nomor hp atau / tempat kerja ke / grup whatsapp / untuk menyerang nama / baiknya / bisa terkena pasal /
   433 kuhp / benar atau tidaknya / perselingkuhan / orang tetap punya / bukti dan tempuh / jalur hukum resmi /
   sebelum viralkan seseorang / pikirkan dulu / apakah yang kamu / sebarkan bisa dibuktikan / dan apakah cara /
   menyebarkannya / justru bisa menjadi / masalah hukum"
  Penutup: logo TITO SUPRIANTO LAW FIRM — "ADVOCATE | LEGAL".

Jadwal (LinkedIn TETAP STOP — perintah Bos 10 Sep 2026):
  IG 09 Okt 11:00 WIB (04:00Z) · FB 09 Okt 19:30 WIB (12:30Z)
Threads: video lewat Repliz SELALU error (bukti 20 Sep, 4 Okt, 6 Okt) -> TIDAK dibuat di sini, nunggu keputusan Bos.

IDEMPOTEN: skip kalau nama file video sudah ada di jadwal akun itu.
Pakai: python3 schedule_tslaw_video_pelakor_1008.py           (dry run — cetak rencana)
       python3 schedule_tslaw_video_pelakor_1008.py --run      (eksekusi)
"""
import sys, json, subprocess, urllib.request, urllib.parse, re

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/"
FN = "tslaw_video_pelakor_pencemaran_1008_h264.mp4"
URL = IMG + FN

CAP = """Nggak semua masalah perlu diselesaikan dengan viral. ⚖️

Coba bayangkan: seseorang cuma bilang "pelakor" sambil menyebar nomor HP atau tempat kerja orang itu ke grup WhatsApp, niatnya biar semua orang tahu. Ternyata cara kayak gitu bisa berbalik jadi perkara pidana buat yang menyebarkan.

Menyerang nama baik orang dengan menuduhkan sesuatu di depan umum bisa masuk Pasal 433 KUHP. Perkara begini tidak berhenti di pertanyaan siapa yang benar, karena yang diperiksa juga cara kamu menyebarkannya.

Bukan berarti kamu dilarang kecewa, apalagi dilarang melapor. Yang penting jalurnya benar: kumpulkan bukti dulu, tempuh proses hukum yang resmi, bukan menyerahkan semuanya ke grup berisi ratusan orang.

Sebelum viralkan seseorang, tanya ke diri sendiri dua hal. Apa yang aku sebarkan ini bisa aku buktikan? Dan cara aku menyebarkannya, apakah tidak justru jadi masalah hukum buat aku sendiri?

Simak penjelasan lengkapnya di video ini ya.

Catatan kecil: konten ini edukasi umum, bukan nasihat hukum untuk kasus tertentu.

Menurut kamu, di titik mana "melapor" berubah jadi ikut melanggar? Tulis di komentar 👇

#pelakor #pencemarannamabaik #hukumpidana #edukasihukum #titosupriantolawfirm"""

JOBS = [
    ("IG", IG, "2026-10-09T04:00:00.000Z", CAP, "TS Law — Nyebar 'Pelakor' Bisa Kena Pidana"),
    ("FB", FB, "2026-10-09T12:30:00.000Z", CAP, "TS Law — Nyebar 'Pelakor' Bisa Kena Pidana"),
]

MODE = "run" if "--run" in sys.argv else "dry"
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


# 1) validasi caption
assert len(CAP) <= 2200, f"caption kepanjangan: {len(CAP)}"
assert "@" not in CAP, "ada mention di caption"
assert CTA_RE.search(CAP[-160:]), "ajakan komentar hilang di ekor caption"
big = [t for t in re.findall(r"#(\w+)", CAP) if t != t.lower()]
assert not big, f"hashtag huruf besar: {big}"
assert not re.search(r"[\u3000-\u303f\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af]", CAP), "teks CJK"
print(f"caption: {len(CAP)} char · CTA+hashtag+mention+CJK OK")

# 2) pastikan media live di 3 jalur funnel
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 + [URL], capture_output=True, text=True)
    codes.append(r.stdout.strip())
print("media HEAD:", codes)
if any(c != "200" for c in codes):
    sys.exit(f"MEDIA TIDAK 200 di semua jalur {codes} -> batal")

# 3) create (idempoten)
existing = all_schedules()
created = []
for label, acc, at, cap, title in JOBS:
    sudah = [s for s in existing if s.get("accountId") == acc and FN.lower() in json.dumps(s).lower()]
    if sudah:
        print(f"SKIP {label}: {FN} sudah ada (id {sudah[0].get('_id') or sudah[0].get('id')})")
        continue
    payload = {
        "accountId": acc, "title": title, "description": cap, "topic": "Edukasi Hukum",
        "type": "video",
        "medias": [{"url": URL, "type": "video", "alt": FN[:-4]}],
        "scheduleAt": at, "replies": [],
    }
    if MODE != "run":
        print(f"[DRY] {label} | {at} | {title} | caption {len(cap)} char")
        continue
    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")
        back = json.load(urllib.request.urlopen(urllib.request.Request(
            f"{BASE}/public/schedule/{sid}", headers=HEADERS), timeout=60))
        print(f"OK {label} | {at} | caption {len(cap)} char | id={sid} | "
              f"baca-balik: {back.get('status')} {back.get('type')} "
              f"{(back.get('medias') or [{}])[0].get('url','').split('/')[-1]}")
        created.append({"label": label, "id": sid})
    except Exception as e:
        body = getattr(e, "read", lambda: b"")()
        print(f"GAGAL {label}: {e} {body[:300]}")

if created:
    json.dump(created, open("/tmp/tslaw_pelakor_1008_ids.json", "w"))
    print(f"\n{len(created)} jadwal dibuat")
