#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Pasang video TS Law "Tanah Waris" (kiriman Bos 9 Okt 2026) + bahasan Threads.

Rencana (semua WIB):
  Senin 12 Okt 11:00  IG  video  (slot video feed)
  Senin 12 Okt 11:00  FB  video
  Senin 12 Okt 09:00  Threads teks bahasan (video lewat Repliz ke Threads selalu error)
  Carousel "8 Anggapan Hukum" (mitos10) yang semula Senin 12 Okt digeser ke Rabu 14 Okt
  supaya IG tidak punya dua post feed di hari yang sama.

Pakai: python3 pasang_video_tslaw_tanah_waris_1009.py         (dry run)
       python3 pasang_video_tslaw_tanah_waris_1009.py --run   (eksekusi)
"""
import json
import re
import subprocess
import sys
import urllib.parse
import urllib.request

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

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

IMG = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
FN = "tslaw_video_tanah_waris_1009_4k_h264.mp4"
URL = IMG + FN
JUDUL = "TS Law — Tanah Waris Dijual Tanpa Persetujuan Ahli Waris"

CAP = """Beli tanah waris yang sudah bersertifikat dan lewat PPAT tetap bisa batal. Ini alasannya. ⚖️

Coba bayangkan: tanah waris sudah dibeli, akta sudah ditandatangani di hadapan notaris, sertifikat sudah pindah nama. Beberapa waktu kemudian muncul seorang ahli waris yang mengaku tidak pernah dilibatkan, dan dia tidak setuju tanah itu dijual.

Kalau benar ada ahli waris yang tidak diajak bicara, jual beli itu bisa dibatalkan. Sertifikat yang sudah terbit pun bisa ikut dipersoalkan.

Ini bukan soal pembeli telat bayar, bukan juga soal dokumennya palsu. Yang jadi masalah: tanah warisan itu belum dibagi, jadi masih milik bersama para ahli waris. Menjualnya butuh persetujuan semuanya, bukan hanya satu orang.

Dasarnya adalah putusan Mahkamah Agung Nomor 3236 K/PDT/1989. Putusan itu jadi acuan: jual beli tanah warisan yang belum dibagi, yang dilakukan satu ahli waris tanpa persetujuan ahli waris lain, tidak sah, walaupun prosedurnya sudah dijalankan lengkap.

Jadi kalau kamu mau beli tanah waris, jangan berhenti di pertanyaan "sertifikatnya ada?". Tanyakan juga siapa saja ahli warisnya, apakah warisan sudah dibagi, dan apakah semuanya sudah memberi persetujuan.

Simak penjelasan lengkapnya di video ini ya.

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

Kalau kamu pernah beli tanah waris, bagian mana yang paling sering dilewatkan saat memeriksa dokumennya? Tulis di komentar 👇

#tanahwaris #jualbelitanah #hukumpertanahan #hukumperdata #sertifikattanah #titosupriantolawfirm"""

TEKS_THREADS = """Tanah waris dijual. Akta sudah ditandatangani di hadapan notaris, sertifikat sudah pindah nama. Ternyata ada ahli waris lain yang tidak pernah dilibatkan.

Kalau benar tidak dilibatkan, jual beli itu bisa dibatalkan. Putusan MA Nomor 3236 K/PDT/1989: penjualan tanah waris yang belum dibagi tanpa persetujuan seluruh ahli waris tidak sah, walau prosedurnya lengkap.

Biasanya pembeli cuma cek sertifikat ada atau tidak.

Menurut kamu, apa lagi yang wajib dicek sebelum beli tanah waris?"""

BUAT = [
    ("IG", IG, "2026-10-12T04:00:00.000Z", "video", CAP, JUDUL, "Hukum Pertanahan"),
    ("FB", FB, "2026-10-12T04:00:00.000Z", "video", CAP, JUDUL, "Hukum Pertanahan"),
    ("Threads", THREADS, "2026-10-12T02:00:00.000Z", "text", TEKS_THREADS,
     "TS Law — Tanah Waris Dijual Sepihak", "Hukum Pertanahan"),
]

# carousel mitos10: (label, id, scheduleAt baru UTC = 14 Okt)
GESER = [
    ("Threads carousel", "6ac3539707008e0e9104842f", "2026-10-14T02:00:00.000Z", "02:00Z 09:00 WIB"),
    ("IG carousel", "6ac35397173307838558141e", "2026-10-14T02:00:00.000Z", "02:00Z 09:00 WIB"),
    ("FB carousel", "6ac3539707008e0e91048445", "2026-10-14T12:30:00.000Z", "12:30Z 19:30 WIB"),
]

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)
CJK_RE = re.compile(r"[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af]")


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


# 1) validasi teks
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 CJK_RE.search(CAP), "teks CJK di caption"
cek_teks_threads(TEKS_THREADS, label="Teks Threads tanah waris")
print(f"caption video: {len(CAP)} char · Threads: {len(TEKS_THREADS)} char · CTA+hashtag+mention+CJK OK")
print(f"topic Threads '{BUAT[2][6]}' = {len(BUAT[2][6])} char (batas 50)")

# 2) media live di 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", "-4", "-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 + geser (idempoten)
existing = semua_jadwal()
dibuat = []
for label, acc, at, typ, teks, judul, topic in BUAT:
    sudah = [s for s in existing if s.get("accountId") == acc and (
        (typ == "video" and FN.lower() in json.dumps(s).lower())
        or (typ == "text" and (s.get("title") or "") == judul))]
    if sudah and typ == "video":
        print(f"SKIP {label}: {FN} sudah ada (id {sudah[0].get('_id')})")
        continue
    if sudah and typ == "text":
        print(f"SKIP {label}: teks bahasan sudah ada (id {sudah[0].get('_id')})")
        continue
    medias = [{"url": URL, "type": "video", "alt": "TS Law tanah waris"}] if typ == "video" else []
    payload = {"accountId": acc, "title": judul, "description": teks, "topic": topic,
               "type": typ, "medias": medias, "scheduleAt": at, "replies": []}
    if MODE != "run":
        print(f"[DRY] {label:8} | {at} | {typ:5} | {len(teks)} char | {judul[:45]}")
        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))
        m = (back.get("medias") or [{}])[0].get("url", "") if back.get("medias") else "-"
        print(f"OK {label:8} | {at} | id={sid} | baca-balik: {back.get('status')} "
              f"{back.get('type')} {str(m).split('/')[-1]} | caption {len(back.get('description') or '')} char")
        dibuat.append({"label": label, "id": sid, "at": at})
    except Exception as e:
        body = getattr(e, "read", lambda: b"")()
        print(f"GAGAL {label}: {e} {body[:300]}")

print()
for label, sid, at, ket in GESER:
    if MODE != "run":
        print(f"[DRY] geser {label:16} id={sid} -> {at} ({ket})")
        continue
    req = urllib.request.Request(f"{BASE}/public/schedule/{sid}",
                                 data=json.dumps({"scheduleAt": at}).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"},
                                 method="PUT")
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            json.load(r)
        back = json.load(urllib.request.urlopen(urllib.request.Request(
            f"{BASE}/public/schedule/{sid}", headers=HEADERS), timeout=60))
        print(f"GESER {label:16} id={sid} -> {back.get('scheduleAt')} | status {back.get('status')} "
              f"| tipe {back.get('type')} | media {(len(back.get('medias') or []))}")
    except Exception as e:
        body = getattr(e, "read", lambda: b"")()
        print(f"GAGAL geser {label}: {e} {body[:300]}")

if dibuat:
    json.dump(dibuat, open("/tmp/tslaw_tanah_waris_ids.json", "w"), indent=1)
    print(f"\n{len(dibuat)} jadwal dibuat")
