#!/usr/bin/env python3
"""Susun usulan konten viral Threads per akun (30 Sep 2026) + validasi tiap caption.

Aturan yang divalidasi (skill atun-social-automation):
- caption final <= 480 char (hard limit Threads 500)
- wajib ada ajakan komentar + link artikel
- hashtag huruf kecil semua, tanpa mention, tanpa CJK
Output: drafts/usulan_konten_threads_20260930.md
"""
import json, re, os

CJK = re.compile(r"[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af]")
MENTION = re.compile(r"@\w+")
URL = re.compile(r"https?://\S+")
CTA = re.compile(r"komentar|pendapat|diskusi|share|pengalaman|menurut (anda|kamu|kalian)", re.I)

ITEMS = [
    dict(akun="ukyhandoko", jenis="opini + cerita lapangan", slot="11:00 atau 17:00 WIB",
         sudut="pemilik usaha: apa yang saya alami sendiri",
         tren="Situs instansi kena sisipan promosi judi online",
         link="https://studiosoft.id/jasa-maintenance-wordpress-surabaya/",
         body=(
            "Saya pernah buka sitemap klien dan ketemu ribuan URL judi online di situsnya. "
            "Bukan hack canggih, cuma WordPress yang tidak pernah di-update.\n\n"
            "Pelakunya kerja halus: Googlebot dikasih halaman judi, pengunjung biasa lihat situs normal. "
            "Yang saya cek tiap bulan: plugin menganggur, akun admin lama, jumlah URL di Search Console.\n\n"
            "Anda pernah cek sitemap situs sendiri? Tulis di komentar."),
         tags="#wordpress #keamananwebsite #seo"),
    dict(akun="ukyhandoko", jenis="tips praktis", slot="20:00 WIB",
         sudut="pemilik usaha: apa yang saya alami sendiri",
         tren="Berita UMKM didorong pakai AI dan big data",
         link="https://studiosoft.id/tools-ai-untuk-bisnis-pilih-sesuai-kebutuhan/",
         body=(
            "Tiga pekerjaan UMKM yang paling cepat beres kalau pakai AI: balas chat pelanggan, "
            "rekap pesanan harian, dan susun caption.\n\n"
            "Itu saja dulu. Yang sering terjadi justru sebaliknya: beli alat paling canggih "
            "sebelum tahu pekerjaan mana yang mengulang tiap hari.\n\n"
            "Tools AI apa yang paling kepakai buat bisnis Anda? Tulis di komentar."),
         tags="#ai #umkm #bisnisdigital"),
    dict(akun="studiosoft.id", jenis="edukasi teknis", slot="08:00 WIB",
         sudut="sisi teknis: bagaimana persisnya kejadiannya",
         tren="Situs instansi kena injeksi promosi judi online",
         link="https://studiosoft.id/jasa-maintenance-wordpress-surabaya/",
         body=(
            "Ada situs instansi kena sisipan promosi judi online. Pintu masuknya bukan server, "
            "tapi plugin yang tidak pernah di-update.\n\n"
            "Yang bikin sulit ketahuan, teknik cloaking: Googlebot dikasih halaman judi, "
            "pengunjung biasa lihat situs normal. Cara ceknya, bandingkan jumlah URL di Search Console "
            "dengan jumlah halaman asli.\n\n"
            "Seberapa rutin situs harus diaudit? Tulis di komentar."),
         tags="#wordpress #seo #keamananwebsite"),
    dict(akun="studiosoft.id", jenis="pertanyaan diskusi", slot="17:00 WIB",
         sudut="sisi teknis: bagaimana persisnya kejadiannya",
         tren="Orang mulai cari rekomendasi lewat AI, bukan cuma mesin pencari",
         link="https://studiosoft.id/apa-itu-geo-generative-engine-optimization/",
         body=(
            "Diskusi: kalau butuh jasa, kalian masih mulai dari Google atau sudah tanya AI?\n\n"
            "Di mesin pencari kita bersaing soal peringkat. Di AI, yang dinilai siapa yang dikutip jadi sumber. "
            "Yang menang bukan halaman terpanjang, tapi datanya jelas dan bisa dicek.\n\n"
            "Sudah berubah belum cara kalian cari rekomendasi? Cerita di komentar."),
         tags="#seo #geo #digitalmarketing"),
    dict(akun="tslaw_firm", jenis="edukasi prosedur", slot="17:00 WIB",
         sudut="prosedur hukum: urutan langkah dan risikonya",
         tren="Mafia tanah dan sengketa lahan Kalisari Surabaya",
         link="https://www.tslaw.id/cara-mengurus-sertifikat-tanah/",
         body=(
            "Sengketa tanah jarang dimulai dari perampasan. Seringnya dari dokumen "
            "yang kita sendiri tidak pernah cek.\n\n"
            "Sebelum uang berpindah: minta warkah tanah ke kantor pertanahan, cocokkan batas di peta "
            "dengan kondisi lapangan, tanyakan apakah sertifikatnya sedang diblokir. "
            "Bandingkan dengan gugatan yang bisa bertahun-tahun.\n\n"
            "Anda pernah cek warkah sebelum beli tanah? Cerita di komentar."),
         tags="#hukumtanah #sertifikattanah #hukumperdata"),
    dict(akun="tslaw_firm", jenis="edukasi prosedur", slot="20:00 WIB",
         sudut="prosedur hukum: urutan langkah dan risikonya",
         tren="Pembagian harta keluarga yang berujung tuntutan ahli waris",
         link="https://www.tslaw.id/warisan-dan-hibah-perbedaan-syarat-cara-mengurus/",
         body=(
            "Ada orang tua membagi rumah ke anaknya semasa hidup. Setelah wafat, anak lain menuntut "
            "bagian lebih besar. Bisa dibatalkan?\n\n"
            "Hibah sering dianggap otomatis bebas dari warisan. Padahal ada bagian yang dilindungi "
            "untuk ahli waris tertentu, dan hitungannya baru muncul saat pembagian warisan.\n\n"
            "Menurut Anda, bagi harta lebih awal atau lewat wasiat? Tulis di komentar."),
         tags="#hukumwaris #hibah #hukumperdata"),
    dict(akun="theskincode_clinic", jenis="koreksi miskonsepsi", slot="17:00 WIB",
         sudut="sisi klinis: apa yang sebenarnya terjadi di kulit",
         tren="Jerawat punggung ramai dibahas pekan ini",
         link="https://www.theskincodeclinic.com/perawatan-bekas-jerawat-krian/",
         body=(
            "Jerawat punggung sering dikira soal kebersihan. Seringnya bukan.\n\n"
            "Pemicunya keringat yang menempel lama dan gesekan tali tas atau pakaian ketat. "
            "Sebagian kasus karena jamur, dan sabun antibakteri malah membuat kulit makin kering.\n\n"
            "Kalau sudah jadi bopeng, krim pemudar tidak meratakan teksturnya.\n\n"
            "Bagian mana yang paling sulit diatasi menurut Anda? Tulis di komentar."),
         tags="#jerawat #kulitsehat #dokterkulitkrian"),
    dict(akun="theskincode_clinic", jenis="edukasi musiman", slot="20:00 WIB",
         sudut="sisi klinis: apa yang sebenarnya terjadi di kulit",
         tren="Musim hujan mulai, rutinitas skincare perlu disesuaikan",
         link="https://www.theskincodeclinic.com/menjaga-skin-barrier-kulit-sehat/",
         body=(
            "Musim hujan mulai. Yang berubah bukan jenis kulitnya, tapi rutinitasnya.\n\n"
            "Pelembap justru sering dilewat karena udara terasa lembap. Padahal kalau lapisan pelindungnya lemah, "
            "kulit gampang perih dan beruntusan. Untuk kulit berminyak, ganti krimnya jadi bentuk gel, "
            "jangan tambah bahan aktif baru.\n\n"
            "Produk mana yang biasanya Anda kurangi saat musim hujan? Cerita di komentar."),
         tags="#skincare #skinbarrier #musimhujan"),
    dict(akun="das_indonesia", jenis="edukasi diagnosa", slot="23:00 WIB",
         sudut="sisi diagnosa: urutan periksa dari yang paling murah",
         tren="Mesin brebet setelah membeli mobil bekas (GridOto)",
         link="https://dasindonesia.com/servis-berkala-nissan-untuk-mobil-bekas-panduan-wajib-agar-awet/",
         body=(
            "Mesin brebet setelah beli mobil bekas biasanya bukan kerusakan besar.\n\n"
            "Urutan periksaannya mulai dari yang paling murah: busi, celah klep, koil, injektor. "
            "Di mobil bekas, yang sering ketemu justru oli lama dan filter udara tersumbat.\n\n"
            "Pernah mengalami gejala ini? Share pengalamanmu di komentar."),
         tags="#mobilbekas #servismobil #bengkelmobilsurabaya"),
    dict(akun="das_indonesia", jenis="edukasi diagnosa", slot="23:00 WIB (hari berikutnya)",
         sudut="sisi diagnosa: urutan periksa dari yang paling murah",
         tren="Garansi mobil gugur karena servis di luar ketentuan (Omoda Jaecoo)",
         link="https://dasindonesia.com/bengkel-resmi-vs-spesialis-vs-umum/",
         body=(
            "Garansi mobil bisa gugur bukan karena mobilnya rusak, tapi karena cara kita merawatnya.\n\n"
            "Catatan servis adalah bagian dari klaim. Tanpa catatan resmi, pabrikan tidak punya alasan "
            "untuk percaya. Suku cadang juga begitu: bukan soal mahal atau murah, tapi jelas asalnya.\n\n"
            "Menurut Anda, wajib servis di bengkel resmi terus? Tulis di komentar."),
         tags="#garansimobil #servismobil #bengkelmobilsurabaya"),
    dict(akun="theeverybe", jenis="edukasi kebiasaan", slot="17:00 WIB",
         sudut="kebiasaan harian, bukan soal produk",
         tren="Keresahan soal rasa tidak nyaman di area kewanitaan",
         link="https://www.everybeofficial.com/pentingnya-menjaga-kebersihan-kewanitaan-setiap-hari/",
         body=(
            "Rasa tidak nyaman di area kewanitaan sering dikira soal kebersihan. Justru sering kebalikannya.\n\n"
            "Area ini punya tingkat keasaman yang harus dijaga. Sabun wangi dan antiseptik berlebihan "
            "bisa mengubahnya. Yang membantu: bahan katun, cepat ganti setelah berkeringat.\n\n"
            "Kebiasaan mana yang paling membantu Anda? Share di komentar."),
         tags="#kesehatanwanita #selfcare #kulitsehat"),
    dict(akun="theeverybe", jenis="edukasi kebiasaan", slot="20:00 WIB",
         sudut="kebiasaan harian, bukan soal produk",
         tren="Estrogen turun disebut pemicu nyeri lutut wanita menopause (RRI)",
         link="https://www.everybeofficial.com/co-bloong-solusi-praktis-pegal-otot-kaku/",
         body=(
            "Nyeri lutut setelah menopause sering dianggap perkara usia. Estrogen ikut menjaga "
            "kekuatan jaringan sekitar sendi.\n\n"
            "Suplemen saja tidak cukup. Otot paha yang kuat yang menopang lutut. "
            "Latihan beban ringan tiga kali seminggu lebih berpengaruh.\n\n"
            "Ada keluarga yang mengalami? Cerita di komentar."),
         tags="#kesehatanwanita #nyerisendi #kebugaran"),
]


# ── koreksi: link yang ternyata SUDAH PERNAH dipakai di akun itu diganti artikel fresh ──
OVERRIDE = {
    ("tslaw_firm", "cerai-harta"): dict(
        jenis="edukasi prosedur", slot="17:00 WIB",
        tren="Berita perceraian publik dan konsultasi rujuk di KUA",
        link="https://www.tslaw.id/panduan-cerai-gugat/",
        body=(
            "Perceraian tidak otomatis membagi semua harta jadi dua.\n\n"
            "Yang dibagi hanya harta bersama, yaitu harta yang diperoleh selama pernikahan. "
            "Harta bawaan dan warisan tetap milik masing-masing, kecuali sudah dicampur jadi satu.\n\n"
            "Menurut Anda, perlu perjanjian perkawinan sebelum menikah? Tulis di komentar."),
        tags="#perceraian #hukumperdata #hukumkeluarga"),
    ("tslaw_firm", "hak-cipta"): dict(
        jenis="edukasi prosedur", slot="20:00 WIB",
        tren="Karya kreator dipakai ulang tanpa izin, ramai dibahas di media sosial",
        link="https://www.tslaw.id/cara-daftar-hak-cipta/",
        body=(
            "Karya Anda otomatis dilindungi hak cipta sejak diwujudkan. Mendaftar bukan syarat, "
            "tapi pencatatan resmi sering jadi penentu.\n\n"
            "Saat dijiplak, yang perlu dibuktikan siapa pencipta pertama dan sejak kapan karyanya ada. "
            "Tanggal unggahan dan pencatatan resmi paling praktis dijadikan bukti.\n\n"
            "Pernah karya Anda dipakai tanpa izin? Cerita di komentar."),
        tags="#hakcipta #kekayaanintelektual #hukum"),
    ("theskincode_clinic", "kulit-kenyal"): dict(
        jenis="koreksi miskonsepsi", slot="17:00 WIB",
        tren="Kebiasaan harian yang bikin kulit kehilangan kekenyalan",
        link="https://www.theskincodeclinic.com/kebiasaan-bikin-kulit-kehilangan-kenyal-3/",
        body=(
            "Kulit kehilangan kekenyalan biasanya dibaca sebagai tanda usia. Seringnya lebih cepat dari itu.\n\n"
            "Dua faktor yang paling sering saya temui: matahari tanpa perlindungan dan tidur yang kurang. "
            "Keduanya mengganggu kolagen di lapisan dalam, bukan cuma permukaan.\n\n"
            "Kebiasaan mana yang paling sulit ditinggalkan? Tulis di komentar."),
        tags="#kulitsehat #antiaging #dokterkulitkrian"),
    ("theskincode_clinic", "bibir"): dict(
        jenis="edukasi musiman", slot="20:00 WIB",
        tren="Musim hujan 2026, keluhan bibir kering dan pecah-pecah",
        link="https://www.theskincodeclinic.com/cara-alami-bikin-bibir-lebih-sehat-menawan-3/",
        body=(
            "Bibir kering saat musim hujan sering diatasi dengan cara yang justru memperburuk: dijilat.\n\n"
            "Bibir tidak punya kelenjar minyak seperti kulit wajah. Air liur menguap dan ikut mengambil "
            "kelembapan, bibir malah makin pecah. Yang menolong: pelembap bertekstur lilin dan "
            "jangan mengelupas kulitnya.\n\n"
            "Bibir Anda mulai kering juga? Cerita di komentar."),
        tags="#kulitsehat #perawatanbibir #dokterkulitkrian"),
    ("das_indonesia", "brebet"): dict(
        jenis="edukasi diagnosa", slot="23:00 WIB",
        tren="Mesin brebet setelah membeli mobil bekas (GridOto)",
        link="https://dasindonesia.com/6-masalah-umum-mesin-nissan-dan-cara-mengatasinya/",
        body=(
            "Mesin brebet setelah beli mobil bekas biasanya bukan kerusakan besar.\n\n"
            "Urutan periksaannya mulai dari yang paling murah: busi, celah klep, koil, injektor. "
            "Di mobil bekas, yang sering ketemu justru oli lama dan filter udara tersumbat.\n\n"
            "Pernah mengalami gejala ini? Share pengalamanmu di komentar."),
        tags="#mobilbekas #servismobil #bengkelmobilsurabaya"),
    ("das_indonesia", "garansi"): dict(
        jenis="edukasi diagnosa", slot="23:00 WIB (hari berikutnya)",
        tren="Garansi mobil gugur karena servis di luar ketentuan (Omoda Jaecoo)",
        link="https://dasindonesia.com/servis-berkala-mobil-honda-jadwal-lengkap-komponen-wajib-dan-tips-dari-teknisi/",
        body=(
            "Garansi mobil bisa gugur bukan karena mobilnya rusak, tapi karena cara kita merawatnya.\n\n"
            "Pabrikan menilai apakah servis berkala dikerjakan sesuai jadwal dan tercatat. "
            "Satu jadwal terlewat, klaim bisa dipersoalkan.\n\n"
            "Menurut Anda, wajib servis di bengkel resmi? Tulis di komentar."),
        tags="#garansimobil #servismobil #bengkelmobilsurabaya"),
    ("theeverybe", "menstruasi"): dict(
        jenis="edukasi kebiasaan", slot="17:00 WIB",
        tren="Keluhan gatal dan tidak nyaman saat menstruasi",
        link="https://www.everybeofficial.com/kesehatan-organ-intim-saat-menstruasi-panduan-kebersihan/",
        body=(
            "Kebersihan saat menstruasi bukan soal wangi, tapi soal cepat diganti.\n\n"
            "Pembalut yang dipakai terlalu lama membuat area lembap, dan itu yang memicu gatal serta bau. "
            "Ganti tiga sampai empat jam sekali dan bilas dengan air bersih tanpa sabun wangi.\n\n"
            "Kebiasaan mana yang paling Anda jaga? Share di komentar."),
        tags="#kesehatanwanita #selfcare #menstruasi"),
    ("theeverybe", "kaki"): dict(
        jenis="edukasi kebiasaan", slot="20:00 WIB",
        tren="Pegal kaki dan sendi pada perempuan (shockwave therapy, estrogen)",
        link="https://www.everybeofficial.com/pegal-di-kaki-setelah-berdiri-lama-penyebab-cara-mengatasi/",
        body=(
            "Pegal di kaki setelah berdiri lama bukan cuma soal lelah.\n\n"
            "Saat berdiri diam, otot betis tidak memompa darah ke atas, sehingga darah menumpuk di kaki. "
            "Yang menolong sederhana: jalan sebentar, angkat tumit berulang, lalu topang kaki saat duduk.\n\n"
            "Keluhan ini sering Anda rasakan? Cerita di komentar."),
        tags="#kebugaran #pegalotot #kesehatanwanita"),
}

# pasangkan override ke item yang sesuai (item lama diganti utuh)
ALIAS = {
    ("tslaw_firm", 0): ("tslaw_firm", "cerai-harta"),
    ("tslaw_firm", 1): ("tslaw_firm", "hak-cipta"),
    ("theskincode_clinic", 0): ("theskincode_clinic", "kulit-kenyal"),
    ("theskincode_clinic", 1): ("theskincode_clinic", "bibir"),
    ("das_indonesia", 0): ("das_indonesia", "brebet"),
    ("das_indonesia", 1): ("das_indonesia", "garansi"),
    ("theeverybe", 0): ("theeverybe", "menstruasi"),
    ("theeverybe", 1): ("theeverybe", "kaki"),
}
_urut = {}
for i, it in enumerate(ITEMS):
    k = _urut.get(it["akun"], 0)
    _urut[it["akun"]] = k + 1
    key = ALIAS.get((it["akun"], k))
    if key:
        it.update(OVERRIDE[key])


def caption_of(it):
    return f"{it['body']}\n\n{it['link']}\n{it['tags']}"


def validasi(t):
    tags = re.findall(r"#(\w+)", t)
    bad = [x for x in tags if x != x.lower()]
    err = []
    if len(t) > 480:
        err.append(f"{len(t)} char (>480)")
    if not URL.search(t):
        err.append("tanpa link")
    if MENTION.search(t):
        err.append("ada mention")
    if CJK.search(t):
        err.append("ada CJK")
    if not CTA.search(t):
        err.append("tanpa ajakan komentar")
    if bad:
        err.append(f"hashtag huruf besar: {bad}")
    return err


print("=" * 80)
print("VALIDASI CAPTION USULAN (final, sudah termasuk link)")
print("=" * 80)
gagal = 0
jejak = set()
for it in ITEMS:
    t = caption_of(it)
    err = validasi(t)
    if err:
        gagal += 1
    print(f"{'OK   ' if not err else 'GAGAL'} {it['akun']:20s} {len(t):4d} char  {err or ''}")
    if (it["akun"], it["link"]) in jejak:
        print("      ⚠️ link dobel di akun yang sama")
    jejak.add((it["akun"], it["link"]))
print("SEMUA VALID" if gagal == 0 else f"{gagal} caption perlu dipangkas")

REACH = [
    ("@ukyhandoko", 227, "166 tayang", "4x/hari", "komentar dari pebisnis & praktisi SEO; post tanya jawab paling hidup"),
    ("@studiosoft.id", 108, "217 tayang", "4x/hari", "post pertanyaan dapat 3 komentar, post ber-link hampir kosong"),
    ("@sotosemarang.pakotto", 67, "87 tayang", "2x/hari", "paling ramai, tapi STOP 24 Sep 2026"),
    ("@leitsurabaya", 12, "3 tayang", "-", "HOLD 29 Sep 2026, kontrak habis"),
    ("@das_indonesia", 8, "50 tayang", "1x/hari", "belum ada komentar publik"),
    ("@tslaw_firm", 8, "45 tayang", "1x/hari", "belum ada komentar publik"),
    ("@theskincode_clinic", 7, "47 tayang", "1x/hari", "1 komentar publik"),
    ("@theeverybe", 4, "14 tayang", "berhenti", "18 jadwal error, tak ada jadwal sejak 21 Sep"),
]

L = []
L.append("# Usulan Konten Viral Threads per Akun, 30 September 2026\n")
L.append("Bahan di dokumen ini diambil dari tarikan langsung: API Repliz (jadwal + komentar masuk), "
         "profil publik Threads (jumlah follower), Google Trends Indonesia, tren X Indonesia (trends24.in), "
         "dan Google News 3 hari terakhir. Semua caption sudah lolos validasi batas 500 karakter, "
         "hashtag huruf kecil, ada ajakan komentar, tanpa mention, tanpa karakter CJK.\n")
L.append("## Peta reach akun Threads\n")
L.append("| Akun | Follower | Tayang | Ritme | Catatan engagement |")
L.append("|---|---|---|---|---|")
for a, f, t, r, c in REACH:
    L.append(f"| {a} | {f} | {t} | {r} | {c} |")
L.append("\nAngka follower dibaca dari profil publik Threads, 30 Sep 2026. "
         "Jumlah tayang dari `/public/schedule` (status success).\n")
L.append("## Sinyal viral yang dipakai\n")
L.append("- Google Trends ID: pertandingan sepak bola, \"1 oktober hari apa\", g30spki, korupsi. "
         "Topik peringatan politik sengaja tidak dipakai, sesuai aturan bebas SARA dan politik.")
L.append("- Tren X Indonesia: KNKT, $STOCK, INDOXL, dan tren fandom.")
L.append("- Hukum: mafia tanah dan Posbankum (14.000 kasus, mayoritas sengketa tanah), "
         "akta van dading di sengketa lahan Kalisari Surabaya, advokat soroti penyebaran identitas penunggak utang.")
L.append("- Kulit: jerawat punggung, bekas jerawat bopeng, salah pakai skincare usia 40+, "
         "musim hujan 2026, PolyPhil dan skin booster.")
L.append("- Otomotif: biaya servis mobil listrik, garansi gugur, RON tinggi di mobil hybrid, "
         "mesin brebet mobil bekas, overhaul.")
L.append("- Kewanitaan dan kebugaran: estrogen turun pemicu nyeri lutut menopause, shockwave therapy, "
         "kebugaran perempuan.")
L.append("- Web dan AI: promosi judi online menyusup ke situs instansi, brand besar minta Google Review, "
         "UMKM didorong pakai AI, agentic AI di kredit bank, Meta AI Muse untuk usaha kecil.\n")
SUDUT = {
    "ukyhandoko": "pemilik usaha, dari pengalaman sendiri",
    "studiosoft.id": "sisi teknis, bagaimana kejadiannya dan bagian mana yang bisa dicek",
    "tslaw_firm": "prosedur hukum, urutan langkah dan risikonya",
    "theskincode_clinic": "sisi klinis, koreksi miskonsepsi lalu penjelasan apa yang terjadi di kulit",
    "das_indonesia": "sisi diagnosa, urutan periksa dari yang paling murah",
    "theeverybe": "kebiasaan harian, bukan soal produk",
}
L.append("## Sudut berbeda per akun\n")
for akun, sdt in SUDUT.items():
    L.append(f"- **@{akun}**: {sdt}.")
L.append("")
ALASAN = {
    "ukyhandoko": "follower 227, sudah cukup besar untuk menahan post ber-link. Sudut cerita pribadi tetap yang paling banyak dibalas, "
                  "jadi link ditaruh di akhir, bukan di kalimat pertama.",
    "studiosoft.id": "follower 108. Di akun ini post pertanyaan dapat 3 komentar, post ber-link hampir nol. "
                     "Karena itu satu caption dibuat murni pertanyaan, satu lagi edukasi teknis.",
    "tslaw_firm": "follower 8, audiensnya masih tipis. Konten prosedural begini biasanya disimpan dan diteruskan ke orang lain, "
                  "bukan dikomentari, jadi jangan ukur dari jumlah komentar.",
    "theskincode_clinic": "follower 7. Tipe pembaca yang datang ke akun klinik biasanya sedang cari solusi, "
                          "jadi koreksi miskonsepsi lebih nempel daripada jualan perawatan.",
    "das_indonesia": "follower 8. Konten gejala begini menyebar lewat share ke teman atau grup, bukan lewat komentar, "
                     "dan itu tetap menambah jangkauan akun kecil.",
    "theeverybe": "follower 4. Jangan jualan terus di akun sekecil ini. Bangun dulu kebiasaan membalas, "
                  "produk cukup disebut di link.",
}
L.append("## Usulan per akun\n")
for it in ITEMS:
    cap = caption_of(it)
    L.append(f"### {it['akun']} / {it['jenis']}")
    L.append(f"- Sudut: {SUDUT[it['akun']]}")
    L.append(f"- Pemicu: {it['tren']}")
    L.append(f"- Slot usul: {it['slot']} (1 post/hari/akun)")
    L.append(f"- Link: {it['link']}")
    L.append(f"- Kenapa cocok dengan reach-nya: {ALASAN[it['akun']]}")
    L.append(f"- Panjang caption final: {len(cap)} char (batas aman 480)\n")
    L.append("```\n" + cap + "\n```\n")
L.append("## Status akun yang belum bisa jalan\n")
L.append("- **@sotosemarang.pakotto**: STOP sejak 24 Sep 2026. Kalau nanti dilanjut, sudut yang belum pernah "
         "dipakai cuma dua: harga versus porsi, dan jam ramai. Sisanya sudah lewat semua.")
L.append("- **@leitsurabaya**: HOLD sejak 29 Sep 2026 (kontrak habis 30 Sep). Tidak ada konten baru "
         "sampai ada keputusan Bos.")
L.append("- **@theeverybe**: 18 jadwal error dan tidak ada jadwal baru sejak 21 Sep. Dua caption di atas baru "
         "bisa jalan kalau pipeline Threads-nya dibereskan dulu, plus akun ini yang followernya paling kecil (4).")
L.append("- **@das_indonesia, @tslaw_firm, @theskincode_clinic**: follower masih di bawah 10. Ukuran keberhasilan "
         "bukan jumlah komentar dulu, tapi konsistensi sudut dan orang yang mulai membalas.\n")
L.append("## Langkah lanjut yang saya tawarkan\n")
L.append("1. Bos pilih caption mana yang lanjut, saya masukkan ke slot kosong lewat `threads_content_today.json` + "
         "`schedule_all_threads.py`, tetap 1 post/hari/akun.")
L.append("2. Setiap link saya verifikasi ulang HTTP 200 dari luar dan cek anti-redundant di semua jadwal Repliz "
         "sebelum create.")
L.append("3. Untuk akun di bawah 15 follower, jangan pasang link di setiap post. Bauran yang sudah terbukti "
         "di akun besar: 40% pertanyaan, 30% opini/tips, 30% artikel berlink.")
L.append("4. Caption @ukyhandoko (judi online di sitemap) dan @studiosoft.id (cara kerja cloaking) memakai artikel "
         "yang sama. Jadwalkan di hari berbeda supaya link tidak muncul dobel di hari yang sama.")
L.append("5. Semua link di dokumen ini sudah dicek dua arah: artikelnya ada di web (WP REST balas judul + tanggal terbit) "
         "dan belum pernah dipakai di akun itu (dibandingkan dengan semua jadwal Repliz).")

os.makedirs("drafts", exist_ok=True)
p = "drafts/usulan_konten_threads_20260930.md"
open(p, "w").write("\n".join(L))
print("\nDokumen:", p, os.path.getsize(p), "byte")
json.dump(ITEMS, open("/tmp/usulan_items.json", "w"), ensure_ascii=False, indent=1)


def batasi(t, maks=480):
    if len(t) <= maks:
        return t
    return t[:maks].rstrip()


rekap = [{"akun": it["akun"], "slot": it["slot"], "link": it["link"],
          "caption": batasi(caption_of(it)), "panjang": len(caption_of(it))} for it in ITEMS]
json.dump(rekap, open("usulan_caption_20260930.json", "w"), ensure_ascii=False, indent=1)
print("JSON caption siap pakai: usulan_caption_20260930.json")
