#!/usr/bin/env python3
"""
TSLaw — Threads Scheduler.
Post nested thread tiap hari, konten hukum tanpa link tslaw.id.
Prime time: 17:00/20:00/23:00 WIB, minimal 2x sehari.
"""
import json, urllib.request, sys, os, base64
from datetime import datetime, timezone, timedelta

from repliz_client import HEADERS, BASE
from threads_text_check import cek_teks_threads, ThreadsTextError

LOG_FILE = "/home/mantapman/.hermes/profiles/atun/workspace/threads_log.txt"
STATE_FILE = "/home/mantapman/.hermes/profiles/atun/workspace/tslaw_threads_state.json"

WIB = timezone(timedelta(hours=7))

ACCOUNT = {
    "id": "6a35f8b7c5ff4ce3a322b2ed",
    "name": "TSLaw",
}

# === BANK KONTEN TSLaw — Tanpa link tslaw.id ===
# 8 series, masing-masing 3 post nested, ≤ 500 chars
CONTENT_SERIES = [
    # Series 1: Kontrak & Perjanjian
    [
        (
            "Punya bisnis tapi belum punya kontrak kerja sama dengan vendor? 🚨\n"
            "\n"
            "Kontrak itu pelindung kamu kalau terjadi sengketa.\n"
            "Tanpa kontrak, kalau ada masalah — siap-siap balas dendam\n"
            "lewat jalur yang panjang & makan biaya.\n"
            "\n"
            "Minimal dalam setiap kontrak:\n"
            "✅ Hak & kewajiban jelas\n"
            "✅ Jangka waktu kerja sama\n"
            "✅ Mekanisme penyelesaian sengketa\n"
            "✅ Klausul force majeure\n"
            "\n"
            "Konsultasi dulu sama lawyer sebelum tanda tangan! 👨‍⚖️\n"
            "\n"
            "#TSLaw #KontrakBisnis #HukumBisnis"
        ),
        (
            "Kontrak kerja karyawan bukan sekadar formalitas administrasi.\n"
            "Ini dokumen penting yang melindungi dua belah pihak. 📄\n"
            "\n"
            "Isi yang wajib ada:\n"
            "🔹 Posisi & deskripsi pekerjaan\n"
            "🔹 Gaji, tunjangan, THR\n"
            "🔹 Jangka waktu (PKWT/PKWTT)\n"
            "🔹 Hak cuti & izin\n"
            "🔹 Aturan PHK & pesangon\n"
            "\n"
            "Banyak bisnis kena masalah gara-gara kontrak kerja\n"
            "asal comot dari internet. Mending konsul lawyer! 💼\n"
            "\n"
            "#TSLaw #KontrakKerja #Ketenagakerjaan"
        ),
        (
            "Hati-hati dengan kontrak sepihak! ⚠️\n"
            "\n"
            "Ciri kontrak sepihak:\n"
            "🔸 Klausul berat sebelah\n"
            "🔸 Ada pasal yang merugikan kamu tanpa timbal balik\n"
            "🔸 Pakai bahasa rumit yang sengaja bikin bingung\n"
            "\n"
            "Tips:\n"
            "✅ Baca sampai tuntas — jangan malas!\n"
            "✅ Minta waktu — kontrak penting jangan buru-buru tanda tangan\n"
            "✅ Konsul lawyer — biaya konsul lebih murah dari kerugian sengketa\n"
            "\n"
            "Jangan biarkan bisnismu dirugikan kontrak abal-abal! 👨‍⚖️\n"
            "\n"
            "#TSLaw #KontrakBisnis #HukumPerdata"
        ),
    ],
    # Series 2: Legalitas UMKM
    [
        (
            "Masih banyak UMKM yang anggap legalitas itu ribet & mahal.\n"
            "Padahal manfaatnya gede banget! 💡\n"
            "\n"
            "Apa aja yang harus diurus:\n"
            "✅ NIB (Nomor Induk Berusaha) — GRATIS lewat OSS!\n"
            "✅ Izin lokasi / izin lingkungan\n"
            "✅ Sertifikat halal (kalo produk makanan/minuman)\n"
            "✅ BPOM (kalo produk kosmetik/obat)\n"
            "\n"
            "Manfaatnya:\n"
            "🔹 Bisa ikut tender & kerja sama B2B\n"
            "🔹 Akses pembiayaan bank & investor\n"
            "🔹 Perlindungan hukum kalau ada sengketa\n"
            "\n"
            "#TSLaw #LegalitasUMKM #Bisnis"
        ),
        (
            "NIB (Nomor Induk Berusaha) itu gerbang legalitas UMKM.\n"
            "Dan kabar baiknya: GRATIS! 🆓✨\n"
            "\n"
            "Cara daftar:\n"
            "🔸 Buka oss.go.id\n"
            "🔸 Daftar pakai NIK & KK\n"
            "🔸 Isi data usaha\n"
            "🔸 Selesai — NIB terbit otomatis\n"
            "\n"
            "Dengan NIB, kamu bisa:\n"
            "✅ Buka rekening atas nama usaha\n"
            "✅ Urus izin lain kayak BPOM/Sertifikat Halal\n"
            "✅ Ikut pameran & bazar resmi\n"
            "\n"
            "Jangan tunda. Urus sekarang juga! 🚀\n"
            "\n"
            "#TSLaw #NIB #UMKMIndonesia"
        ),
        (
            "Banyak UMKM kena razia gara-gara NIB & izin usaha belum diurus.😱\n"
            "\n"
            "Izin usaha itu bukan biaya — ini investasi!\\n\n"
            "Kalo belum punya:\n"
            "❌ Bisa disegel / ditutup paksa\n"
            "❌ Kena denda & sanksi pidana\n"
            "❌ Gak bisa ikut program bantuan pemerintah\n"
            "\n"
            "Prosesnya sekarang lebih mudah:\n"
            "✅ Semua online via OSS\n"
            "✅ Gratis (kecuali izin khusus)\n"
            "✅ Cepet — NIB bisa terbit dalam 1 hari\n"
            "\n"
            "Jangan nunggu kena razia baru urus! 😅\n"
            "\n"
            "#TSLaw #LegalitasUsaha #UMKM"
        ),
    ],
    # Series 3: Merek & HKI
    [
        (
            "Punya merek dagang? Jangan lupa daftarkan ke DJKI! 🏷️\n"
            "\n"
            "Kenapa penting:\\n\n"
            "🔸 Merek yang terdaftar punya perlindungan hukum\n"
            "🔸 Orang lain gak bisa pakai merek kamu\n"
            "🔸 Aset perusahaan yang bisa dinilai uang\n"
            "\n"
            "Yang bisa didaftarkan:\n"
            "✅ Nama brand\n"
            "✅ Logo\n"
            "✅ Slogan\n"
            "✅ Kombinasi warna & desain\n"
            "\n"
            "Siap-siap aja, prosesnya 12-18 bulan.\n"
            "Makin awal daftar, makin aman bisnismu! 🔒\n"
            "\n"
            "#TSLaw #HKI #MerekDagang"
        ),
        (
            "Tau gak kalo HAKI (Hak Kekayaan Intelektual) itu ada banyak jenis? 🤔\n"
            "\n"
            "1. Hak Cipta — karya tulis, musik, software, desain\n"
            "2. Merek — nama & logo brand\n"
            "3. Paten — invensi teknologi\n"
            "4. Desain Industri — tampilan produk\n"
            "5. Rahasia Dagang — resep, formula, strategi\n"
            "\n"
            "Banyak pengusaha baru sadar pentingnya HAKI setelah\n"
            "produknya ditiru atau mereknya dipakai orang lain.\n"
            "\n"
            "Cegah sebelum kejadian! 📋💪\n"
            "\n"
            "#TSLaw #HAKI #KekayaanIntelektual"
        ),
        (
            "Merek itu aset berharga. Kalau belum didaftarkan ke DJKI,\n"
            "orang lain bisa daftarin duluan. Dan kamu... kalah. 🚫\n"
            "\n"
            "Contoh kasus nyata:\n"
            "🔸 Merek lokal dipakai orang asing — ribut di pengadilan\n"
            "🔸 Nama toko didaftarin mantan karyawan — ganti nama\n"
            "🔸 Logo ditiru kompetitor — gak bisa apa-apa kalo gak daftar\n"
            "\n"
            "Proteksi merek itu murah dibanding kerugian kalau kena sengketa.\\n\n"
            "Jangan tunda — daftarkan merek kamu sekarang! 🏷️✨\n"
            "\n"
            "#TSLaw #MerekDagang #HKI"
        ),
    ],
    # Series 4: Sengketa Bisnis
    [
        (
            "Sengketa bisnis itu wajar. Yang gak wajar adalah kalau\n"
            "penyelesaiannya tanpa jalur hukum yang jelas. ⚖️\\n\n"
            "Jenis sengketa bisnis:\n"
            "🔹 Wanprestasi — mitra ingkar janji\n"
            "🔹 Perbuatan melawan hukum\n"
            "🔹 Sengketa merek\n"
            "🔹 Sengketa konsumen\n"
            "🔹 Sengketa saham & kepemilikan\n"
            "\n"
            "Solusinya:\n"
            "✅ Musyawarah dulu\n"
            "✅ Mediasi jika perlu\n"
            "✅ Litigasi (pengadilan) sebagai jalan terakhir\n"
            "\n"
            "#TSLaw #SengketaBisnis #HukumPerdata"
        ),
        (
            "Punya piutang macet? Langkah pertama bukan langsung\n"
            "lapor polisi atau bawa preman. Tenang dulu. 😌\\n\n"
            "Langkah hukum yang benar:\\n\n"
            "1️⃣ Kirim somasi (teguran resmi) — paling mudah\n"
            "2️⃣ Negosiasi ulang jadwal bayar\n"
            "3️⃣ Mediasi — pakai pihak ketiga netral\n"
            "4️⃣ Gugatan perdata — kalo semua gagal\n"
            "\n"
            "Prosesnya bertahap. Gak perlu langsung panas.\n"
            "Ada lawyer yang bisa bantu dari awal! 👨‍⚖️💼\n"
            "\n"
            "#TSLaw #PiutangMacet #SengketaBisnis"
        ),
        (
            "Bingung bedanya law firm vs pengacara individu? 🤔\n"
            "\n"
            "Law Firm:\n"
            "✅ Tim lengkap — berbagai spesialisasi\n"
            "✅ Lebih cocok untuk korporasi\n"
            "✅ Kapasitas menangani kasus besar\n"
            "\n"
            "Pengacara Individu:\n"
            "✅ Biaya lebih terjangkau\n"
            "✅ Cocok untuk perorangan / UMKM\n"
            "✅ Lebih personal\n"
            "\n"
            "Pilih sesuai kebutuhan. Yang penting:\n"
            "advokatnya kompeten & punya izin! 📜\n"
            "\n"
            "#TSLaw #LawFirm #Pengacara"
        ),
    ],
    # Series 5: Ketenagakerjaan
    [
        (
            "Banyak pengusaha lupa kalau BPJS Ketenagakerjaan itu\n"
            "kewajiban, bukan opsi! ⚠️\n"
            "\n"
            "Sanksi kalau gak daftarin karyawan:\n"
            "🔸 Denda administrasi\n"
            "🔸 Sanksi pidana kurungan\n"
            "🔸 Larangan ikut tender\n"
            "🔸 Publikasi nama perusahaan\n"
            "\n"
            "Yang wajib didaftarkan:\n"
            "✅ JKK (Jaminan Kecelakaan Kerja)\n"
            "✅ JKM (Jaminan Kematian)\n"
            "✅ JHT (Jaminan Hari Tua)\n"
            "✅ JP (Jaminan Pensiun)\n"
            "\n"
            "Jangan cari masalah. Patuhi aturan! 📋\n"
            "\n"
            "#TSLaw #BPJS #Ketenagakerjaan"
        ),
        (
            "Masih bingung bedanya PKWT & PKWTT? Tenang, ini gampang! 😊\n"
            "\n"
            "PKWT = kontrak waktu tertentu (karyawan kontrak)\\n\n"
            "🔹 Ada batas waktu / proyek selesai\\n\n"
            "🔹 Maks 2 tahun, bisa perpanjang 1 tahun\\n\n"
            "🔹 Selesai kontrak — dapat kompensasi\\n\n"
            "PKWTT = kontrak waktu tidak tertentu (karyawan tetap)\\n\n"
            "🔹 Gak ada batas waktu\\n\n"
            "🔹 PHK harus ada alasan jelas\\n\n"
            "🔹 Berhak pesangon\\n\n"
            "\\nPahami status karyawan kamu biar gak kena masalah hukum! 👨‍⚖️\n"
            "\n"
            "#TSLaw #Ketenagakerjaan #PKWT"
        ),
        (
            "PHK itu pilihan terakhir — bukan pertama. 🛑\n"
            "\n"
            "Prosedur PHK yang benar:\n"
            "1️⃣ Peringatan tertulis (SP1, SP2, SP3)\n"
            "2️⃣ Pembinaan & evaluasi\n"
            "3️⃣ Musyawarah bipartit\n"
            "4️⃣ Mediasi dengan Disnaker\n"
            "5️⃣ Baru PHK — dengan pesangon sesuai UU\n"
            "\n"
            "Kalo langsung PHK tanpa prosedur — bisa digugat!\n"
            "Karyawan bisa minta pembatalan PHK + ganti rugi.\n"
            "\n"
            "Pastikan prosedurnya bener. Ada lawyer yang bantu! 💼\n"
            "\n"
            "#TSLaw #PHK #Ketenagakerjaan"
        ),
    ],
    # Series 6: Korporasi & PT
    [
        (
            "Banyak yang mikir bikin PT itu ruwet & mahal. Padahal\n"
            "sekarang bisa online & lebih murah! 🏢\n"
            "\n"
            "Prosedur singkat:\\n\n"
            "✅ Siapkan nama PT — minimal 3 opsi\\n\n"
            "✅ Akta notaris — bikin di notaris\\n\n"
            "✅ SK Kemenkumham — online via AHU\\n\n"
            "✅ NPWP & pengukuhan PKP\\n\n"
            "✅ NIB & izin usaha via OSS\\n\n"
            "\\nModal minimal? UU terbaru gak ada modal minimum\\n\n"
            "untuk PT perorangan! Cuma perlu pernyataan modal. 💡\n"
            "\n"
            "#TSLaw #PendirianPT #Bisnis"
        ),
        (
            "PT perorangan — solusi buat pengusaha kecil yang mau\n"
            "punya badan hukum tanpa ribet. 🎯\n"
            "\n"
            "Kelebihan:\n"
            "✅ Cukup 1 orang — gak perlu minimal 2 pemegang saham\n"
            "✅ Gak perlu akta notaris (online aja)\n"
            "✅ Modal sesuai kemampuan — gak ada minimal\n"
            "✅ Lebih kredibel di mata bank & investor\n"
            "\n"
            "Kekurangan:\n"
            "❌ Cuma buat UMKM (mikro & kecil)\n"
            "❌ Gak bisa punya komisaris\n"
            "\n"
            "Cocok untuk usaha kamu? Konsul dulu aja! 💼😊\n"
            "\n"
            "#TSLaw #PTPerorangan #UMKM"
        ),
        (
            "Waktu adalah uang — apalagi kalo bisnis kamu lagi\n"
            "bermasalah secara hukum. ⏰💰\n"
            "\n"
            "Yang sering bikin bisnis boncos:\n"
            "🔸 Kontrak bermasalah — baru sadar pas udah rugi\n"
            "🔸 Legalitas belum lengkap — kena razia & denda\n"
            "🔸 Merek gak terdaftar — dipakai orang lain\n"
            "🔸 Karyawan gak terdaftar BPJS — kena sanksi\n"
            "\n"
            "Solusi: legal check-up rutin tiap tahun.\n"
            "Lebih murah daripada bayar sengketa! 📋✨\n"
            "\n"
            "#TSLaw #LegalCheckUp #Korporasi"
        ),
    ],
    # Series 7: Konsumen & Perlindungan
    [
        (
            "Kasus sengketa konsumen sering banget terjadi. Dari\n"
            "produk cacat sampai layanan gak sesuai janji. 😤\n"
            "\n"
            "Hak konsumen menurut UU:\n"
            "✅ Dapat produk sesuai standar mutu\n"
            "✅ Informasi yang jelas & jujur\n"
            "✅ Kompensasi kalau produk cacat\n"
            "✅ Didengar keluhannya\n"
            "\n"
            "Langkah kalau kamu kena:\n"
            "1️⃣ Komplain ke penjual resmi\n"
            "2️⃣ Lapor ke LPKSM / BPKN\n"
            "3️⃣ Mediasi melalui BPSK\n"
            "4️⃣ Gugatan perdata\n"
            "\n"
            "Jangan diem aja! 🗣️👨‍⚖️\n"
            "\n"
            "#TSLaw #PerlindunganKonsumen #Hukum"
        ),
        (
            "Iklan produk kecantikan yang janji instan... hati-hati! ⚠️\n"
            "\n"
            "Pelaku usaha wajib bertanggung jawab atas:\n"
            "🔸 Iklan yang menyesatkan (tipu-tipu) — bisa dilaporkan\n"
            "🔸 Produk kadaluwarsa / rusak — wajib ganti\n"
            "🔸 Produk tanpa izin edar — pidana!\n"
            "\n"
            "Contoh: skincare ilegal tanpa BPOM bikin iritasi.\n"
            "Pelaku usaha wajib ganti rugi + bisa dipidana.\n"
            "\n"
            "Konsumen juga harus cerdas. Cek BPOM sebelum beli! ✅\n"
            "\n"
            "#TSLaw #PerlindunganKonsumen #BPOM"
        ),
        (
            "Pinjaman online ilegal lagi marak. Korban kebanyakan\n"
            "orang yang lagi butuh uang cepat. 😰\n"
            "\n"
            "Ciri pinjol ilegal:\n"
            "🔸 Bunga mencekik & denda gak wajar\n"
            "🔸 Akses semua kontak HP\n"
            "🔸 Debt collector terror\n"
            "🔸 Gak terdaftar di OJK\n"
            "\n"
            "Kalo udah terlanjur:\n"
            "✅ Jangan bayar — lapor OJK & Polisi\n"
            "✅ Blokir akses kontak\n"
            "✅ Kumpulin bukti ancaman\n"
            "\n"
            "Pinjam di tempat resmi aja! Cek dulu di ojk.go.id 🛡️\n"
            "\n"
            "#TSLaw #PinjolIlegal #PerlindunganKonsumen"
        ),
    ],
    # Series 8: Properti & Waris
    [
        (
            "Perjanjian sewa itu bukan sekadar bayar tiap bulan.\n"
            "Ada hukum yang ngatur! 🏠📄\n"
            "\n"
            "Yang harus diperhatikan:\n"
            "🔹 Jangka waktu sewa jelas\n"
            "🔹 Hak & kewajiban penyewa & pemilik\n"
            "🔹 Aturan perpanjangan\n"
            "🔹 Mekanisme jika ada kerusakan\n"
            "🔹 Jaminan (deposit) — berapa & kapan dikembalikan\n"
            "\n"
            "Banyak sengkete sewa gara-gara perjanjian lisan.\n"
            "Tulis hitam di atas putih! 📝\n"
            "\n"
            "#TSLaw #HukumProperti #SewaMenyewa"
        ),
        (
            "Urusan waris itu sensitif. Tanpa surat wasiat yang jelas,\n"
            "harta bisa jadi rebutan keluarga. 😕\n"
            "\n"
            "Pembagian waris di Indonesia diatur:\n"
            "✅ Hukum Perdata (BW) — untuk non-muslim\n"
            "✅ Hukum Islam (Kompilasi Hukum Islam) — untuk muslim\n"
            "\n"
            "Tips:\n"
            "🔸 Buat surat wasiat sedini mungkin\n"
            "🔸 Libatkan notaris & ahli waris\n"
            "🔸 Simpan di tempat aman\n"
            "\n"
            "Jangan sampai warisan jadi sumber konflik keluarga.\n"
            "Rencanakan dari sekarang! 💼👨‍⚖️\n"
            "\n"
            "#TSLaw #HukumWaris #SuratWasiat"
        ),
        (
            "Sertifikat tanah — jangan percaya fisiknya doang.\n"
            "Cek ke BPN dulu! 🏞️⚠️\n"
            "\n"
            "Banyak kasus sertifikat palsu atau tumpang tindih:\n"
            "🔸 Sertifikat tapi tanahnya bukan milik penjual\n"
            "🔸 Dua orang pegang sertifikat tanah yang sama\n"
            "🔸 Tanah negara dijual seolah milik pribadi\n"
            "\n"
            "Sebelum beli tanah:\n"
            "✅ Cek ke BPN — minta info riwayat tanah\n"
            "✅ Cek fisik lokasi — dateng langsung\n"
            "✅ Minta SKT / girik dan verifikasi\n"
            "\n"
            "Lebih aman pake lawyer properti! 🏛️😊\n"
            "\n"
            "#TSLaw #HukumProperti #SertifikatTanah"
        ),
    ],
]


def enforce_max_chars(text, maxlen=500):
    """VALIDASI KETAT (FIXED 5 Agustus 2026): teks harus <= maxlen & semua link nyala.
    Kalau tidak lolos -> return None (JANGAN dipotong, JANGAN dikirim)."""
    try:
        return cek_teks_threads(text, label="Caption Threads", maxlen=maxlen)
    except ThreadsTextError as e:
        print(f"  SKIP: {e}")
        return None



def load_state():
    if not os.path.exists(STATE_FILE):
        return {"last_series": -1}
    with open(STATE_FILE) as f:
        return json.load(f)


def save_state(state):
    with open(STATE_FILE, "w") as f:
        json.dump(state, f)


def log_result(series_idx, date_str, ids):
    entry = f"TSLaw | Series {series_idx+1} | {date_str} | IDs: {', '.join(ids)}\n"
    with open(LOG_FILE, "a") as f:
        f.write(entry)


def schedule(text, scheduleAt_iso, parentId=None):
    text = enforce_max_chars(text)
    if text is None:
        return None
    payload = {
        'title': '', 'description': text, 'topic': 'Hukum', 'type': 'text',
        'medias': [], 'meta': {'title': '', 'description': '', 'url': ''},
        'additionalInfo': {
            'isAiGenerated': False, 'isDraft': False,
            'collaborators': [], 'mentions': [],
            'music': {'id': '', 'artist': '', 'name': '', 'thumbnail': ''},
            'products': [], 'tags': []
        },
        'replies': [], 'accountId': ACCOUNT["id"], 'scheduleAt': scheduleAt_iso,
    }
    if parentId:
        payload['replies'] = [parentId]

    body = json.dumps(payload).encode()
    req = urllib.request.Request(f'{BASE}/public/schedule', data=body, headers=HEADERS, method='POST')
    try:
        with urllib.request.urlopen(req) as r:
            result = json.loads(r.read())
            sid = result.get('scheduleId', '?')
            print(f'  ✅ {sid}')
            return sid
    except urllib.error.HTTPError as e:
        err = e.read().decode()
        print(f'  ❌ ERROR {e.code}: {err[:200]}')
        return None


def main():
    print('⚖️ TSLaw — Daily Scheduler')
    print('=' * 50)

    state = load_state()
    last_series = state.get("last_series", -1)
    next_series = (last_series + 1) % len(CONTENT_SERIES)
    series = CONTENT_SERIES[next_series]

    today = datetime.now(WIB).date()
    slots = [
        f'{today.isoformat()}T17:00:00+07:00',
        f'{today.isoformat()}T20:00:00+07:00',
        f'{today.isoformat()}T23:00:00+07:00',
    ]

    print(f'\n📅 {today.isoformat()}')
    print(f'📋 Series {next_series + 1} of {len(CONTENT_SERIES)}: {["Kontrak & Perjanjian","Legalitas UMKM","Merek & HKI","Sengketa Bisnis","Ketenagakerjaan","Korporasi & PT","Konsumen & Perlindungan","Properti & Waris"][next_series]}')
    print()

    ids = []
    prev = None
    for i, (post, slot) in enumerate(zip(series, slots)):
        print(f'  Post {i+1} ({slot[11:16]} WIB):')
        sid = schedule(post, slot, parentId=prev)
        if sid:
            ids.append(sid)
            prev = sid
        else:
            print(f'    ❌ Gagal di post {i+1}')
            break

    if len(ids) == 3:
        print(f'\n{"="*50}')
        print('✅ TSLaw SUCCESS!')
        for i, sid in enumerate(ids):
            print(f'  {slots[i][11:16]} WIB → ID: {sid}')
        log_result(next_series, str(today), ids)
        state["last_series"] = next_series
        save_state(state)
    else:
        print('\n⚠️ Ada yang gagal.')


if __name__ == "__main__":
    main()

