#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""FB TS Law — penuhi tugas mingguan Facebook (27 Sep - 3 Okt 2026).

Perintah Bos 29 Sep 2026: "selesaikan ini untuk FB TSLAW" (screenshot tugas
creator dashboard: 5 post publik, 5 reel, 1 balas komentar, 5 post berfoto).

Isi: 5 video vertikal (reel) 11:00 WIB + 4 post foto 19:30 WIB, 29 Sep - 3 Okt.
Post foto ke-5 dari minggu ini sudah ada (jadwal "Mitos atau Fakta" 1 Okt 19:30).
`replies=[]` WAJIB untuk Facebook.

Pakai:
  python3 tslaw_fb_mingguan_20260929.py            # daftar + validasi caption
  python3 tslaw_fb_mingguan_20260929.py --go       # buat jadwal + verifikasi
"""
import re
import sys
import time
from datetime import datetime, timezone, timedelta

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

FB = "6a3b41d1c5ff4ce3a32753e8"          # Tito Supriyanto Law Firm
BASE = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
TOPIC_REEL = "Reel Edukasi Hukum"
TOPIC_FOTO = "Edukasi Hukum"
WIB = timezone(timedelta(hours=7))

TAIL_WA = "Butuh pendampingan hukum? Konsultasikan masalah hukum Anda dengan Tito Suprianto Law Firm: {link}\n📲 WhatsApp: +62 819-0922-2026"
DISK = "Konten ini bersifat edukasi umum dan bukan nasihat hukum untuk kasus spesifik."

# ── caption ─────────────────────────────────────────────────────────────────

CAP_CERAI = f"""Mitos atau Fakta: istri tidak bisa mengajukan gugatan cerai kalau suami tidak memberi izin? Jawabannya MITOS. ❌

Dalam hukum Indonesia, seorang istri punya hak yang sah untuk mengajukan gugatan cerai ke pengadilan tanpa izin dari suami. Hakim memutus bukan berdasarkan izin pasangan, tapi pembuktian alasan hukum yang sah menurut peraturan perundang-undangan. Keputusan ada di tangan pengadilan, bukan di salah satu pihak.

Tonton videonya sampai habis ya.

Mitos hukum apa lagi yang sering bikin bingung? Tulis di kolom komentar, kita bahas. 👇

{TAIL_WA.format(link="https://www.tslaw.id/panduan-cerai-gugat/")}

{DISK}

#tslaw #titosuprantolawfirm #hukumkeluarga #gugatancerai #edukasihukum #konsultasihukum #hukumindonesia"""

CAP_MAAP = f"""Mitos atau Fakta: kalau pelaku sudah minta maaf, urusan hukumnya otomatis selesai? Belum tentu. 🤔

Banyak yang mengira ucapan maaf langsung menghapus tindak pidana yang sudah terjadi. Secara hukum tidak sesederhana itu. Dalam UU No. 1 Tahun 2023 (KUHP baru), permaafan atau perdamaian dari korban bisa menjadi pertimbangan hakim untuk meringankan hukuman, bukan menghapus tindak pidananya.

Tonton videonya sampai habis biar paham bedanya.

Menurut Anda, apakah maaf seharusnya cukup untuk menyelesaikan persoalan hukum? Tulis pendapat Anda di komentar. 👇

{TAIL_WA.format(link="https://www.tslaw.id/konsultasi-hukum-kapan-dan-mengapa/")}

{DISK}

#tslaw #titosuprantolawfirm #kuhpbaru #hukumpidana #mitosataufakta #edukasihukum #hukumindonesia"""

CAP_MATERAI = f"""Anggapan bahwa perjanjian tanpa materai tidak sah di mata hukum itu keliru. 📄

Materai adalah instrumen bea dokumen, bukan syarat sahnya sebuah perjanjian. Syarat sah perjanjian diatur dalam KUHPerdata: sepakat para pihak, cakap hukum, objek yang jelas, dan sebab yang halal. Materai berperan pada kekuatan pembuktian dan kewajiban bea, bukan penentu sah atau tidaknya kontrak.

Tonton videonya sampai habis buat tahu dasar hukumnya.

Pertanyaan buat Anda: apakah selama ini Anda selalu memakai materai untuk setiap kontrak kerja sama? Cerita di komentar. 👇

{TAIL_WA.format(link="https://www.tslaw.id/kontrak-bisnis-yang-aman/")}

{DISK}

#tslaw #titosuprantolawfirm #kontrakbisnis #perjanjiansah #hukumbisnis #edukasihukum #hukumindonesia"""

CAP_PINJOL = f"""Telat bayar pinjol 90 hari, utang otomatis hangus? Jawabannya: TIDAK. 🔍

Banyak yang percaya angka 90 hari bikin utang otomatis lunas atau gugur. Faktanya, angka itu berkaitan dengan status keterlambatan, bukan penghapusan kewajiban.

90 HARI BUKAN BATAS HAPUS UTANG
Selama Anda menyetujui perjanjian pinjaman, kewajiban membayar pokok, biaya, dan ketentuan lain tetap mengacu pada isi perjanjian yang Anda tanda tangani. Karena itu, baca kembali kontraknya sebelum mengambil kesimpulan.

APA RISIKONYA JIKA MENUNGGAK?
• Tagihan dan biaya tetap berjalan sesuai perjanjian
• Riwayat atau penilaian kredit dapat terdampak
• Penagihan dapat dilakukan melalui kanal resmi
• Sengketa dapat berlanjut ke proses hukum

TAPI, PENAGIHAN TETAP PUNYA BATAS
Penagihan tidak boleh dilakukan dengan ancaman, intimidasi, penyebaran data pribadi, atau kontak berulang yang mengganggu. Simpan bukti setiap komunikasi, kenali hak Anda.

LANGKAH YANG BISA ANDA LAKUKAN
1. Cek legalitas platform
2. Baca dan hitung kembali tagihan
3. Simpan perjanjian, bukti transfer, dan chat
4. Ajukan komunikasi atau restrukturisasi secara tertulis
5. Gunakan kanal pengaduan resmi bila ada pelanggaran

Jangan menghilang. Menghadapi tagihan dengan pemahaman yang benar jauh lebih aman daripada diam saja.

Pernah atau sedang menghadapi situasi seperti ini? Tulis pengalaman atau pertanyaan Anda di kolom komentar, kita diskusikan bersama. 👇

{TAIL_WA.format(link="https://www.tslaw.id/")}

{DISK}

#tslaw #titosuprantolawfirm #pinjol #pinjamandigital #hukumbisnis #edukasihukum #konsultasihukum"""

CAP_PERDATA = f"""Mengalami masalah hukum perdata? Jangan panik dulu, kenali langkah awalnya. ⚖️

Sengketa perdata sering muncul dari hal yang terlihat sederhana: wanprestasi kontrak, utang piutang, sengketa tanah, sampai masalah warisan. Yang membedakan hasil akhirnya bukan besar-kecilnya masalah, tapi seberapa tepat langkah awal yang Anda ambil.

Di video ini kami rangkum hal penting yang perlu Anda pahami saat menghadapi masalah hukum perdata, dari langkah pertama, bukti yang wajib disiapkan, sampai kapan sebaiknya melibatkan advokat.

Pernah menghadapi situasi serupa atau punya pertanyaan soal hukum perdata? Tulis di kolom komentar, tim kami siap membantu menjawab. 👇

{TAIL_WA.format(link="https://www.tslaw.id/6-cara-mediasi-sengketa-bisnis-oleh-kantor-pengacara-surabaya-terpercaya-2/")}

{DISK}

#tslaw #titosuprantolawfirm #hukumperdata #sengketabisnis #konsultasihukum #edukasihukum #hukumindonesia"""

CAP_KONTRAK = f"""Kontrak yang jelas bukan formalitas, tapi pagar yang bikin kerja sama lebih aman. 📄

Banyak sengketa bisnis berawal dari hal sederhana: kesepakatan yang hanya diucapkan lisan, atau pasal yang tidak pernah dibaca ulang. Kontrak yang rapi membantu memperjelas hak, kewajiban, ruang lingkup, tenggat waktu, sampai cara menyelesaikan masalah kalau nanti muncul perbedaan.

Semakin detail ditulis di awal, semakin kecil ruang salah paham di kemudian hari. Tuliskan kesepakatan sebelum bekerja sama, bukan sesudah masalah muncul.

Pertanyaan buat Anda: bagian apa yang paling sering Anda lewatkan saat membaca kontrak kerja sama? Tulis di komentar, kita bahas bersama. 👇

{TAIL_WA.format(link="https://www.tslaw.id/klausul-penyelesaian-sengketa-kontrak-umkm/")}

{DISK}

#tslaw #titosuprantolawfirm #kontrakbisnis #hukumbisnis #umkmindonesia #edukasihukum #konsultasihukum"""

CAP_KONSUMEN = f"""Hak konsumen itu nyata dan dilindungi undang-undang, bukan sekadar itikad baik penjual. 🛡️

Konsumen berhak mendapat informasi yang benar, jelas, dan tidak menyesatkan. Konsumen juga berhak menerima barang atau layanan sesuai kualitas, jumlah, dan kondisi yang dijanjikan. Kalau promosi bilang A tapi yang datang B, itu bukan sekadar kurang beruntung.

Buat pelaku usaha, memahami hak konsumen bukan ancaman, tapi cara membangun kepercayaan. Informasi yang jujur, layanan yang sesuai, dan promosi yang tidak berlebihan membuat pelanggan kembali tanpa perlu dipaksa.

Sebagai konsumen atau pelaku usaha, bagian mana yang menurut Anda paling sering diabaikan? Tulis di komentar. 👇

{TAIL_WA.format(link="https://www.tslaw.id/hak-konsumen-di-indonesia-perlindungan-hukum/")}

{DISK}

#tslaw #titosuprantolawfirm #hakkonsumen #hukumbisnis #umkmindonesia #edukasihukum #konsultasihukum"""

CAP_GAMBAR = f"""Tidak semua gambar di internet bebas Anda pakai untuk promosi. 📷

Banyak pelaku usaha mengambil foto dari hasil pencarian lalu memasangnya di unggahan jualan. Padahal karya orang lain, termasuk foto dan desain, dilindungi hak cipta. Izin pemilik atau lisensi yang jelas adalah dasarnya, bukan kata "sudah ada di Google".

Pelanggaran hak cipta bisa berujung teguran, tuntutan ganti rugi, sampai sanksi hukum. Pilih gambar dari sumber yang jelas, periksa lisensinya, dan simpan bukti izin pemakaian.

Pernah menemukan karya Anda dipakai tanpa izin, atau justru ingin memastikan aset promosi Anda aman? Cerita di komentar. 👇

{TAIL_WA.format(link="https://www.tslaw.id/cara-daftar-hak-cipta-2026/")}

{DISK}

#tslaw #titosuprantolawfirm #hakcipta #kekayaanintelektual #hukumbisnis #edukasihukum #konsultasihukum"""

CAP_REPUTASI = f"""Reputasi online juga punya dampak hukum, bukan cuma soal citra. ⭐

Ulasan pelanggan, komentar, dan percakapan di media sosial bisa membentuk persepsi orang terhadap bisnis Anda. Ketika ulasan tidak benar atau komentar menyerang tanpa dasar, dampaknya bukan hanya penjualan, tapi juga nama baik.

Di sisi lain, ikut menyerang balik dengan kata-kata kasar bisa berbalik menjadi masalah hukum untuk Anda sendiri. Yang aman: simpan bukti, telusuri faktanya, lalu tempuh jalur yang benar, termasuk somasi atau laporan bila memang memenuhi unsur.

Pernah menerima ulasan atau komentar yang merugikan usaha Anda? Bagaimana Anda menyikapinya? Tulis di komentar. 👇

{TAIL_WA.format(link="https://www.tslaw.id/7-langkah-hukum-melaporkan-pencemaran-nama-baik-di-media-sosial/")}

{DISK}

#tslaw #titosuprantolawfirm #reputasibisnis #pencemarannamabaik #hukumbisnis #edukasihukum #konsultasihukum"""

# (tanggal WIB, jam, menit, jenis, file media, judul, caption)
PLAN = [
    ("2026-09-29", 11, 0, "video", "tslaw_video_cerai_01.mp4",
     "TS Law — Mitos Gugatan Cerai", CAP_CERAI),
    ("2026-09-29", 19, 30, "image", "tslaw_edu_08.jpg",
     "TS Law — Kontrak yang Jelas, Sengketa yang Minim", CAP_KONTRAK),
    ("2026-09-30", 11, 0, "video", "tslaw_reel_mitosfakta_01.mp4",
     "TS Law — Mitos atau Fakta: Minta Maaf Tak Hapus Pidana", CAP_MAAP),
    ("2026-09-30", 19, 30, "image", "tslaw_edu_13.jpg",
     "TS Law — Hak Konsumen Itu Nyata", CAP_KONSUMEN),
    ("2026-10-01", 11, 0, "video", "tslaw_video_materai_0918_h264.mp4",
     "TS Law — Kontrak Tanpa Materai", CAP_MATERAI),
    ("2026-10-02", 11, 0, "video", "tslaw_reel_pinjol_01.mp4",
     "TS Law — Telat Bayar Pinjol 90 Hari, Utang Otomatis Hangus?",
     CAP_PINJOL),
    ("2026-10-02", 19, 30, "image", "tslaw_edu_17.jpg",
     "TS Law — Gambar Online Tak Selalu Bebas Pakai", CAP_GAMBAR),
    ("2026-10-03", 11, 0, "video", "tslaw_reel_perdata_01.mp4",
     "TS Law — Menghadapi Masalah Hukum Perdata", CAP_PERDATA),
    ("2026-10-03", 19, 30, "image", "tslaw_edu_15.jpg",
     "TS Law — Reputasi Online dan Dampak Hukumnya", CAP_REPUTASI),
]


def to_utc(tanggal, jam, menit):
    dt = datetime.fromisoformat(f"{tanggal}T{jam:02d}:{menit:02d}:00+07:00")
    return dt.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")


def validasi():
    masalah = []
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        if len(cap) > 5000:
            masalah.append(f"{tgl} {judul}: caption {len(cap)} char (kepanjangan)")
        if re.search(r"@\w+", cap):
            masalah.append(f"{tgl} {judul}: ada mention")
        besar = [t for t in re.findall(r"#([^\s#]+)", cap) if t != t.lower()]
        if besar:
            masalah.append(f"{tgl} {judul}: hashtag huruf besar {besar}")
        if "komentar" not in cap.lower():
            masalah.append(f"{tgl} {judul}: tanpa ajakan komentar")
        if "tslaw.id" not in cap:
            masalah.append(f"{tgl} {judul}: tanpa link tslaw.id")
        if not re.search(r"[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]", cap):
            pass
        else:
            masalah.append(f"{tgl} {judul}: ada karakter CJK")
    return masalah


def semua_jadwal(c):
    docs, page = [], 1
    while page <= 200:
        r = None
        for a in range(6):
            try:
                r = c.get_schedules(page=page, limit=100)
                break
            except Exception:
                time.sleep(5 + 3 * a)
        if r is None:
            break
        b = r.get("docs") or []
        if not b:
            break
        docs += b
        if len(b) < 100:
            break
        page += 1
    return docs


def index_media(docs):
    idx = {}
    for d in docs:
        if d.get("accountId") != FB:
            continue
        if d.get("status") not in ("pending", "success", "processing", "draft"):
            continue
        for m in (d.get("medias") or []):
            fn = (m.get("url") or "").split("/")[-1].lower()
            if fn:
                idx.setdefault(fn, (d.get("_id"), d.get("status"),
                                     str(d.get("scheduleAt"))[:16]))
    return idx


def main():
    go = "--go" in sys.argv
    masalah = validasi()
    for m in masalah:
        print("❗", m)
    print(f"\ntotal item: {len(PLAN)} | masalah caption: {len(masalah)}")
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        print(f"  {tgl} {jam:02d}:{menit:02d} WIB | {jenis:5} | {f:36} | {len(cap):4} char | {judul}")
    if masalah:
        print("\nBATAL: perbaiki caption dulu.")
        return
    if not go:
        print("\n(dry-run — tambahkan --go untuk membuat jadwal)")
        return

    c = get_client()
    idx = index_media(semua_jadwal(c))
    dibuat = []
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        at = to_utc(tgl, jam, menit)
        if f.lower() in idx:
            print(f"⏭️  {f}: sudah ada {idx[f.lower()]} — SKIP")
            continue
        media = [{"url": BASE + f, "type": jenis, "alt": f}]
        sid = None
        for attempt in range(1, 5):
            try:
                res = c.create_schedule(FB, cap, at, title=judul,
                                        topic=TOPIC_REEL if jenis == "video" else TOPIC_FOTO,
                                        type_=jenis, medias=media, replies=[])
                sid = res.get("scheduleId") or res.get("_id") or res.get("id")
                break
            except Exception as e:
                print(f"    ⚠️ percobaan {attempt} gagal: {str(e)[:120]}")
                time.sleep(10)
        if sid:
            dibuat.append((sid, f, at, jenis))
            print(f"✅ {tgl} {jam:02d}:{menit:02d} WIB {jenis:5} {f:36} id={sid}")
        else:
            print(f"❌ GAGAL create {f}")

    print("\n=== VERIFIKASI (baca ulang per ID) ===")
    for sid, f, at, jenis in dibuat:
        d = c.get_schedule(sid)
        d = d.get("data") or d
        if isinstance(d, dict) and "docs" in d:
            d = d["docs"][0]
        ok = (d.get("status") == "pending"
              and d.get("scheduleAt") == at
              and (d.get("medias") or [{}])[0].get("url", "").endswith(f))
        print(f"  {'✅' if ok else '⚠️'} {sid} {f} status={d.get('status')} "
              f"at={d.get('scheduleAt')} type={d.get('type')} replies={d.get('replies')}")


if __name__ == "__main__":
    main()
