#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TS Law — video "WANPRESTASI vs PMH" (kiriman Bos 5 Okt 2026 via MEGA).

Asal: "PMH - WAN PREASTASI.mp4" (HEVC 2160x3840, 31,5 dtk) -> transcode H.264 1080x1920.
Tayang 6 Okt 2026 di 3 akun TS Law (LinkedIn TETAP STOP, perintah Bos 10 Sep):
  Threads 09:00 WIB (02:00Z) · IG 11:00 WIB (04:00Z) · FB 19:30 WIB (12:30Z)
IDEMPOTEN: skip kalau nama file video sudah ada di jadwal akun itu.
Caption: DRAFT Atun (Bos tidak mengirim caption) — santai "kamu", hashtag huruf kecil, 0 mention.
"""
import sys, json, subprocess, urllib.request, urllib.parse

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

CAP = """Wanprestasi dan PMH sering dianggap sama. Padahal keduanya beda jalur hukumnya. ⚖️

Wanprestasi itu soal tidak memenuhi kewajiban yang sudah disepakati di perjanjian. Dasarnya ya perjanjian itu sendiri. Contohnya: barang nggak dikirim sesuai kesepakatan, atau pembayaran macet.

PMH (Perbuatan Melawan Hukum) itu perbuatan yang melanggar hukum dan bikin orang lain rugi, walaupun sebelumnya nggak ada perjanjian apa pun. Contoh paling gampang: merusak barang orang lain.

Kenapa bedanya penting buat kamu tahu? Karena dasar tuntutan, cara pembuktian, sampai ganti rugi yang bisa diminta itu beda, tergantung jalur mana yang dipakai. Salah pilih dasar, tuntutan bisa jatuh di persidangan.

Simak penjelasan lengkapnya di video ini ya.

Kalau kamu pernah berhadapan dengan sengketa kayak gini, menurut kamu jalur mana yang lebih pas? Tulis di komentar 👇

#wanprestasi #perbuatanmelawanhukum #hukumperdata #edukasihukum #titosupriantolawfirm"""

CAP_THREADS = """Wanprestasi dan PMH sering dianggap sama, padahal beda jalur hukumnya. ⚖️

Wanprestasi = nggak memenuhi kewajiban yang sudah disepakati di perjanjian.

PMH = perbuatan yang melanggar hukum dan bikin orang lain rugi, walau nggak ada perjanjian sebelumnya.

Simak videonya sampai habis ya.

Kamu pernah hadapi sengketa kayak gini? Tulis di komentar 👇

#wanprestasi #perbuatanmelawanhukum #hukumperdata #edukasihukum"""

JOBS = [
    ("Threads", THREADS, "2026-10-06T02:00:00.000Z", CAP_THREADS, "TS Law — Wanprestasi vs PMH"),
    ("IG",      IG,      "2026-10-06T04:00:00.000Z", CAP,         "TS Law — Wanprestasi vs PMH"),
    ("FB",      FB,      "2026-10-06T12:30:00.000Z", CAP,         "TS Law — Wanprestasi vs PMH"),
]

import re
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 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}"
    assert CTA_RE.search(cap[-160:]), 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")

# 2) validasi 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", "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) buat jadwal (idempoten)
existing = all_schedules()
ok = 0
created = []
for label, acc, at, cap, title in JOBS:
    already = [s for s in existing if s.get("accountId") == acc and FN.lower() in json.dumps(s).lower()]
    if already:
        sid = already[0].get("_id") or already[0].get("id")
        print(f"SKIP {label}: {FN} sudah ada di jadwal (id {sid})")
        continue
    payload = {
        "accountId": acc,
        "title": title,
        "description": cap,
        "topic": "Edukasi Hukum",
        "type": "video",
        "medias": [{"url": URL, "type": "video", "alt": FN[:-4]}],
        "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} | caption {len(cap)} char | id={sid}")
        created.append((label, 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([{"label": l, "id": i} for l, i in created], open("/tmp/tslaw_pmh_1005_ids.json", "w"))
