#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — video "Pasal 411 KUHP: perselingkuhan dan risiko sebar bukti".

Video kiriman Bos 13 Okt 2026 (link MEGA, HEVC 4K 2160x3840 40,9 dtk) → di-encode
ulang ke H.264 4K (2160x3840) karena Repliz menolak HEVC.

Tayang 16 Okt 2026 (Bos: "tayangkan 3 hari lagi") di 3 akun TS Law
(LinkedIn TETAP STOP sejak 10 Sep 2026):
  Threads 09:00 WIB (02:00Z) · IG 11:00 WIB (04:00Z) · FB 19:30 WIB (12:30Z)

Supaya tetap 1 konten feed/hari/akun, 3 item seri "Mitos atau Fakta" (mitos_fakta_09,
KTP sebagai jaminan) yang semula 16 Okt digeser ke 17 Okt di jam yang sama.

IDEMPOTEN: skip kalau nama file video sudah ada di jadwal akun itu; geser mitos
hanya kalau item-nya masih di tanggal 16 Okt.

Pakai: /usr/bin/python3 pasang_video_tslaw_411_1016.py          (dry run)
       /usr/bin/python3 pasang_video_tslaw_411_1016.py --run    (eksekusi)
"""
import json
import subprocess
import sys
import urllib.parse
import urllib.request
from datetime import datetime, timedelta, timezone

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

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

IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
FN = "tslaw_video_pasal411_1016_4k_h264.mp4"
URL = IMG + FN
TITLE = "TS Law — Pasal 411 KUHP: Perselingkuhan dan Risiko Sebar Bukti"
MODE = "run" if "--run" in sys.argv else "dry"

CAP = """Perselingkuhan bukan cuma persoalan hati. Di KUHP terbaru, perzinaan diatur di Pasal 411 dan ancaman pidananya penjara maksimal 1 tahun.

Tapi ada satu hal yang perlu kamu tahu dulu: ini delik aduan. Artinya proses hukumnya tidak jalan kalau tidak ada pengaduan dari pihak yang berhak melapor. Jadi bukti selingkuh yang kamu simpan itu untuk kepentingan hukum, bukan untuk disebar.

Sebab kalau foto, percakapan, atau identitas seseorang kamu sebar ke media sosial, yang muncul justru persoalan hukum lain, dan bisa lebih berat dari masalah awalnya.

Jadi sebelum mengunggah sesuatu, pahami dulu risiko hukumnya.

Kalau ada pertanyaan soal kasus seperti ini, tulis di komentar ya. 👇

Butuh pendampingan hukum? Konsultasikan masalah hukum Anda dengan Tito Suprianto Law Firm: https://tslaw.id
📲 WhatsApp: +62 819-0922-2026

Konten ini bersifat edukasi hukum, bukan nasihat hukum untuk kasus tertentu.

#tslaw #titosuprantolawfirm #hukumindonesia #edukasihukum #literasihukum #kuhp #perselingkuhan #hukumkeluarga #perlindungandata #advokatindonesia"""

CAP_THREADS = """Perselingkuhan bukan cuma persoalan hati.

Di KUHP terbaru, perzinaan diatur di Pasal 411 dan diancam penjara maksimal 1 tahun.

Tapi ini delik aduan: tanpa pengaduan, prosesnya tidak jalan. Bukti selingkuh disimpan untuk kepentingan hukum, bukan untuk disebar.

Kalau foto, percakapan, atau identitas orang lain kamu sebar, muncul persoalan hukum lain.

Pahami risikonya sebelum mengunggah. Ada pertanyaan? Tulis di komentar.

Konsultasi: tslaw.id · WA +62 819-0922-2026

#tslaw #kuhp #literasihukum"""

JOBS = [
    ("Threads", THREADS, "2026-10-16T02:00:00.000Z", CAP_THREADS),
    ("IG",      IG,      "2026-10-16T04:00:00.000Z", CAP),
    ("FB",      FB,      "2026-10-16T12:30:00.000Z", CAP),
]

# item seri "Mitos atau Fakta" (mitos_fakta_09) yang harus digeser 16 → 17 Okt
GESER = [
    ("Threads mitos_fakta_09", "6ab10f373032e3a79cf4533b"),
    ("IG mitos_fakta_09",      "6ab10b6b3032e3a79cf2f689"),
    ("FB mitos_fakta_09",      "6ab10f3802078a414ace9293"),
]
TARGET_GESER = "2026-10-17T"  # tanggal baru (jam tetap)


def semua_jadwal():
    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


# ── 0) validasi caption ──
assert len(CAP) <= 2200, f"caption panjang: {len(CAP)}"
assert len(CAP_THREADS) <= 500, f"caption Threads {len(CAP_THREADS)} > 500"
for cap in (CAP, CAP_THREADS):
    assert "@" not in cap, "ada mention di caption"
print(f"caption: full {len(CAP)} char · Threads {len(CAP_THREADS)} char")

# ── 1) media live lewat funnel (3 jalur) ──
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", "60", "-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")

cl = get_client()

# ── 2) geser item seri mitos_fakta_09 dari 16 → 17 Okt ──
for label, sid in GESER:
    j = cl.get_schedule(sid)
    at = j.get("scheduleAt") or ""
    if at.startswith(TARGET_GESER):
        print(f"⏭️  {label}: sudah di {at} → SKIP geser")
        continue
    baru = at.replace("2026-10-16T", TARGET_GESER, 1)
    print(f"{'🔁' if MODE == 'run' else '[DRY]'} {label} {sid}: {at} → {baru}")
    if MODE != "run":
        continue
    cl.update_schedule(sid, {"scheduleAt": baru})
    back = cl.get_schedule(sid)
    print(f"   baca-balik: {back.get('scheduleAt')} | {back.get('status')} | "
          f"{back.get('type')} | {(back.get('medias') or [{}])[0].get('url', '').split('/')[-1]}")

# ── 3) buat jadwal video ──
existing = semua_jadwal()
for label, acc, at, cap 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"⏭️  {label}: {FN} sudah ada di jadwal → SKIP (id {sudah[0].get('_id') or sudah[0].get('id')})")
        continue
    print(f"{'✅' if MODE == 'run' else '[DRY]'} {label} {at} | caption {len(cap)} char | video {FN}")
    if MODE != "run":
        continue
    res = cl.create_schedule(acc, cap, at, title=TITLE, topic="Edukasi Hukum",
                             type_="video", medias=[{"url": URL, "type": "video", "alt": FN[:-4]}],
                             replies=[])
    sid = res.get("scheduleId") or res.get("_id") or res.get("id")
    print(f"   dibuat id={sid}")
    back = cl.get_schedule(sid)
    bm = (back.get("medias") or [{}])[0]
    print(f"   baca-balik: status={back.get('status')} type={back.get('type')} "
          f"scheduleAt={back.get('scheduleAt')} media={bm.get('url', '').split('/')[-1]} "
          f"replies={back.get('replies')}")
