#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Perintah Bos 8 Okt 2026: "semua konten IG yang ada kamu bahas juga n ajak orang komentar di threads TSlaw".

Yang dikerjakan:
 1. **Post Threads BARU** untuk topik video 9 Okt (nyebar "pelakor" = Pasal 433 KUHP) — video lewat Repliz
    selalu gagal di Threads, jadi topiknya DIB AHAS sebagai post teks + ajakan komentar, slot antrian
    Threads TS Law 09:00 WIB (02:00Z).
 2. **6 caption Threads carousel "Mitos atau Fakta"** yang tadinya cuma nyuruh geser slide
    (339–396 char, tanpa isi) → ditulis ulang jadi BAHASAN: 2-3 mitos disebut isinya + ajakan komentar.
    (5 post image mitos_fakta_07..11 sudah bahas + ajak komentar sejak awal, tidak disentuh.)

Aturan: Threads ≤500 char (target ≤480), ajakan komentar di 160 char terakhir, 0 mention, hashtag
huruf kecil, 0 CJK. Threads TS Law: tanpa link situs di caption carousel (konsisten dengan yang terpasang).

Pakai: python3 threads_tslaw_bahas_ig.py         (dry run — cetak panjang + verifikasi)
       python3 threads_tslaw_bahas_ig.py --run   (eksekusi)
"""
import sys

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

MODE = "run" if "--run" in sys.argv else "dry"
THREADS = ACC.TSLAW_THREADS

# ── (1) post BARU: topik video pelakor di Threads ──
BARU_TITLE = "TS Law — Bahas: Nyebar 'Pelakor' Bisa Kena Pidana"
BARU_AT = "2026-10-09T02:00:00.000Z"   # 09:00 WIB, slot antrian Threads TS Law
BARU_TOPIC = "Pencemaran Nama Baik"
BARU_CAP = """Nggak semua masalah selesai dengan viral. ⚖️

Nyebut seseorang pelakor sambil nyebarin nomor HP atau tempat kerjanya ke grup WhatsApp bisa berbalik jadi perkara pidana untuk yang menyebarkan. Salah satu pasal yang bisa kena: Pasal 433 KUHP.

Yang dinilai bukan cuma benar atau tidaknya perselingkuhan, tapi juga cara kita menyebarkannya.

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

#pencemarannamabaik #edukasihukum #tslaw"""

# ── (2) caption Threads carousel: dari "geser slide" jadi bahasan ──
GANTI = {
    # 12 Okt 09:00 WIB — carousel mitos10 (8 anggapan hukum umum)
    "6ac3539707008e0e9104842f": """Mitos atau fakta? Delapan anggapan hukum ini sering dipercaya, padahal keliru. ⚖️

Chat WhatsApp katanya tidak bisa jadi bukti. Perkara pidana katanya harus dilaporkan dalam 24 jam, kalau lewat perkaranya hilang. Pisah rumah lama katanya otomatis dianggap cerai.

Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #hukumpidana #edukasihukum #tslaw""",
    # 24 Okt 09:00 WIB — carousel mitosproses (proses hukum)
    "6ac46f6b8bb99cea57a73101": """Mitos atau fakta? Delapan anggapan soal proses hukum ini sering dipercaya, padahal keliru. ⚖️

Somasi katanya sama dengan panggilan pengadilan. Damai katanya cukup disepakati lisan. Mediasi katanya cuma buang waktu.

Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #hukumacara #edukasihukum #tslaw""",
    # 26 Okt 09:00 WIB — carousel mitoshak (hak & kewajiban)
    "6ac470f4efef33b908847484": """Mitos atau fakta? Delapan anggapan soal hak dan kewajiban ini keliru. ⚖️

Uang muka katanya otomatis hangus kalau pembeli membatalkan. Tanpa kwitansi katanya pembayaran dianggap tidak pernah ada. Kesepakatan lewat chat katanya tidak berkekuatan apa pun.

Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #hukumperdata #edukasihukum #tslaw""",
    # 29 Okt 09:00 WIB — carousel mitoskerja (kerja & perusahaan)
    "6ac471528bb99cea57a7a77d": """Mitos atau fakta? Delapan anggapan soal kerja dan perusahaan ini keliru. ⚖️

Cuti katanya otomatis hangus. Gaji katanya boleh ditahan sebagai jaminan. Kontrak kerja katanya bisa diperpanjang terus tanpa batas.

Ketiganya diatur, bukan diserahkan ke kebiasaan kantor. Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #ketenagakerjaan #edukasihukum #tslaw""",
    # 31 Okt 09:00 WIB — carousel mitosbukti (bukti & hak)
    "6ac46fd48bb99cea57a7496c": """Mitos atau fakta? Delapan anggapan soal bukti dan hak ini keliru. ⚖️

Tanpa saksi mata katanya perkara tidak jalan. Laporan dicabut katanya perkara berhenti. Tidak tahu aturannya katanya tidak bisa disalahkan.

Ketiganya yang paling sering bikin orang memilih diam. Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #hukumacara #edukasihukum #tslaw""",
    # 2 Nov 09:00 WIB — carousel mitostanah (tanah & properti)
    "6ac473738bb99cea57a84332": """Mitos atau fakta? Delapan anggapan soal tanah dan properti ini sering dipercaya, padahal keliru. ⚖️

Sudah bayar lunas katanya otomatis jadi pemilik. Sertifikat hilang katanya tanahnya ikut hilang. Telat bayar cicilan sekali katanya rumah langsung disita.

Kedelapannya kami bahas di carousel ini, tiap slide ada sisi mitos dan faktanya.

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

#mitosataufakta #hukumproperti #edukasihukum #tslaw""",
}

import re  # noqa: E402
CTA_RE = re.compile(r"komentar|diskusi|pendapat|tulis di|menurut (kamu|anda)|setuju|cerita", re.I)


def validasi(nama, cap):
    soal = []
    if len(cap) > 480:
        soal.append(f"kepanjangan {len(cap)} char (batas aman 480)")
    if "@" in cap:
        soal.append("ada mention")
    if not CTA_RE.search(cap[-160:]):
        soal.append("ajakan komentar tidak ada di 160 char terakhir")
    big = [t for t in re.findall(r"#(\w+)", cap) if t != t.lower()]
    if big:
        soal.append(f"hashtag huruf besar {big}")
    try:
        cek_teks_cjk(cap, konteks=nama)
    except Exception as e:  # noqa: BLE001
        soal.append(str(e))
    print(f"  {nama:22} {len(cap):4} char  {'OK' if not soal else '⚠️ ' + '; '.join(soal)}")
    return soal


print("=== validasi caption ===")
masalah = validasi("BARU video-pelakor", BARU_CAP)
masalah += [x for sid, cap in GANTI.items() for x in validasi(sid, cap)]
if masalah:
    sys.exit("batal: ada caption yang tidak lolos validasi")

cl = get_client()

# ── (1) post baru ──
print("\n=== post Threads baru (topik video) ===")
ada = None
for page in (1, 2, 3):
    d = cl.get_schedules(page=page, limit=100)
    for s in d.get("docs", d.get("data", [])):
        if s.get("accountId") == THREADS and BARU_TITLE == (s.get("title") or ""):
            ada = s
            break
    if ada or not d.get("hasNextPage"):
        break
if ada:
    print(f"  SKIP — sudah ada (id {ada.get('_id')}, {ada.get('scheduleAt')}, {ada.get('status')})")
elif MODE != "run":
    print(f"  [DRY] POST {BARU_AT} | topic={BARU_TOPIC} | caption {len(BARU_CAP)} char")
else:
    res = cl.create_schedule(THREADS, BARU_CAP, BARU_AT, title=BARU_TITLE,
                             topic=BARU_TOPIC, type_="text", replies=[])
    sid = res.get("scheduleId") or res.get("_id") or res.get("id")
    back = cl.get_schedule(sid)
    print(f"  OK id={sid} | baca-balik: {back.get('status')} {back.get('type')} | {back.get('scheduleAt')} "
          f"| topic={back.get('topic')!r} | caption {len(back.get('description') or '')} char | replies={back.get('replies')}")

# ── (2) ganti caption carousel ──
print("\n=== caption Threads carousel: bahasan + ajakan komentar ===")
for sid, cap in GANTI.items():
    lama = cl.get_schedule(sid)
    print(f"  {sid} | {lama.get('scheduleAt')} | {lama.get('status')} | lama {len(lama.get('description') or '')} char "
          f"-> baru {len(cap)} char")
    if (lama.get("description") or "").strip() == cap.strip():
        print("    SKIP — sudah sama")
        continue
    if MODE != "run":
        print("    [DRY] PUT description")
        continue
    cl.update_schedule(sid, {"description": cap})
    back = cl.get_schedule(sid)
    ok = (back.get("description") or "").strip() == cap.strip()
    print(f"    PUT ok={ok} | baca-balik {len(back.get('description') or '')} char | {back.get('status')} "
          f"{(back.get('medias') or [{}])[0].get('url','').split('/')[-1]}")
