#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""fb_ss_teks_tambahan.py — TAMBAH POST TEKS di Facebook StudioSoft (6a334952c5ff4ce3a3225941).

Dasar: tip Instagram 2 Okt 2026 yang dikirim Bos ("posting lebih banyak teks minggu ini — postingan teks
mendapat 399% lebih banyak tayangan") → diterapkan ke Facebook StudioSoft: 2 post teks/hari di slot kosong.

Aturan yang dipegang: type=text, medias=[], replies=[] (WAJIB untuk FB — kalau tidak: error postId),
hashtag huruf kecil, 0 mention, ada ajakan komentar, 0 karakter CJK, tanpa gambar.

Mode: preview [N] | run [N]
"""
import json
import os
import re
import sys
from datetime import datetime, timedelta, timezone

from repliz_client import get_client, ReplizError

WIB = timezone(timedelta(hours=7))
SLOTS_WIB = [5, 8, 11, 14, 17, 20, 23]
ACC_FB = "6a334952c5ff4ce3a3225941"
STATE = "fb_ss_teks_state.json"
PER_HARI = 2

L_PROP = "https://studiosoft.id/digital-marketing-bisnis-properti/"
L_SEO = "https://studiosoft.id/seo-untuk-bisnis-properti/"
L_ANA = "https://studiosoft.id/analitik-digital-bisnis-properti/"
L_RET = "https://studiosoft.id/digital-marketing-bisnis-retail/"
L_KEU = "https://studiosoft.id/digital-marketing-bisnis-keuangan/"
L_MAN = "https://studiosoft.id/digital-marketing-bisnis-manufaktur/"

BANK = [
    dict(judul="Tiga tanda website sudah bekerja",
         teks="Banyak pemilik usaha menganggap website sudah beres karena tampilannya rapi. Tiga tanda ini lebih jujur "
              "menjawab apakah website Anda benar-benar bekerja.\n\n"
              "Satu, ada orang masuk lewat pencarian, bukan cuma dari orang yang sudah kenal Anda.\n"
              "Dua, pertanyaan yang masuk lewat WhatsApp atau telepon menyebut hal yang dibaca dari halaman tertentu.\n"
              "Tiga, Anda tahu halaman mana yang paling sering menghasilkan percakapan.\n\n"
              "Kalau ketiganya tidak ada, masalahnya bukan di desain. Biasanya di struktur halaman dan cara mengukur.\n\n"
              "Menurut Anda, dari tiga tanda itu, mana yang paling sering terlewat? Tulis di komentar.",
         tag="#websitesbisnis #digitalmarketing #umkm"),
    dict(judul="Iklan dulu atau fondasi dulu",
         teks="Pertanyaan yang sering muncul di grup pemilik usaha: punya anggaran terbatas, sebaiknya langsung pasang iklan "
              "atau rapikan website dulu?\n\n"
              "Jawaban jujurnya: iklan bisa mendatangkan kunjungan dalam hitungan hari, tapi kalau halaman yang dituju belum "
              "menjawab pertanyaan calon pembeli, anggarannya habis tanpa prospek. Kebalikannya, website yang rapi tanpa "
              "dikunjungi siapa pun juga tidak menghasilkan apa-apa.\n\n"
              "Jalan tengah yang biasa kami pakai: rapikan satu halaman yang paling penting dulu, pasang pelacakan supaya "
              "ketahuan mana yang bekerja, baru naikkan anggaran iklan perlahan.\n\n"
              "Kalau di bisnis Anda, mana yang didahulukan? Saya penasaran dengan alasannya di kolom komentar.",
         tag="#digitalmarketing #iklanonline #umkm"),
    dict(judul="Bengkel yang ramai karena halaman layanan",
         teks="Ada bengkel yang sebelumnya hanya mengandalkan pelanggan langganan. Setelah dibuatkan halaman terpisah untuk "
              "tiap layanan, misalnya servis berkala, tune up, dan perbaikan AC, percakapan yang masuk berubah bentuk: "
              "orang datang sudah tahu apa yang mau dikerjakan dan menanyakan estimasi biaya.\n\n"
              "Pelajaran yang kami ambil sederhana. Orang mencari layanan spesifik, bukan kata 'bengkel lengkap'. Satu halaman "
              "untuk satu layanan mempertemukan mereka dengan jawaban yang tepat.\n\n"
              "Di bisnis Anda, layanan mana yang paling sering dicari tapi belum punya halaman sendiri? Cerita di komentar.",
         tag="#seolokal #bengkel #digitalmarketing"),
    dict(judul="Mitos SEO selesai setelah peringkat satu",
         teks="Kalimat yang sering kami dengar: nanti kalau sudah peringkat satu, pekerjaannya selesai.\n\n"
              "Kenyataannya, peringkat itu berubah. Pesaing baru muncul, halaman lama kehilangan relevansi, dan perilaku "
              "pencarian ikut bergeser. Yang membuat hasil bertahan bukan sekali kerja besar, tapi kebiasaan kecil: "
              "menambah halaman baru yang menjawab pertanyaan pembeli, memperbarui informasi harga, dan memeriksa halaman "
              "yang mulai turun.\n\n"
              "SEO lebih mirip merawat kebun daripada membangun monumen.\n\n"
              "Setuju atau tidak? Kalau punya pengalaman sendiri soal ini, tulis di komentar.",
         tag="#seo #digitalmarketing #umkm"),
    dict(judul="Lima hal sebelum naikkan anggaran iklan",
         teks="Sebelum menambah anggaran iklan bulan ini, lima hal ini layak dicek dulu.\n\n"
              "Pertama, apakah pelacakan konversi sudah jalan, minimal klik WhatsApp dan pengiriman formulir. Kedua, apakah "
              "kata kunci pencarian tidak relevan sudah diblokir. Ketiga, apakah halaman pendaratannya menjawab apa yang "
              "dijanjikan iklannya. Keempat, apakah tahu berapa biaya per prospek bulan lalu. Kelima, apakah ada yang "
              "menjawab percakapan yang masuk dalam hitungan menit, bukan jam.\n\n"
              "Dari lima itu, biasanya yang paling sering terlewat adalah nomor lima.\n\n"
              "Menurut Anda, mana yang paling sulit dijalankan? Tulis pendapat Anda di komentar.",
         tag="#iklanonline #digitalmarketing #bisnisonline"),
    dict(judul="Pertanyaan pelanggan adalah bahan konten",
         teks="Kalau bingung mau bikin konten apa, buka saja riwayat percakapan WhatsApp sebulan terakhir. Di situ ada bahan "
              "yang sudah terbukti dicari orang.\n\n"
              "Pertanyaan yang muncul berulang layak jadi satu halaman tersendiri di website, atau satu video pendek yang "
              "menjawabnya. Pertanyaan yang muncul sekali bisa jadi balasan komentar yang baik.\n\n"
              "Cara ini hemat waktu, karena Anda tidak mengarang topik. Yang paling penting, isinya pasti relevan karena "
              "memang ditanyakan pembeli.\n\n"
              "Pertanyaan apa yang paling sering masuk ke bisnis Anda? Tulis di komentar, siapa tahu bisa jadi bahan tulisan "
              "berikutnya.",
         tag="#kontenmarketing #umkm #digitalmarketing"),
    dict(judul="Kenapa halaman layanan kami tidak membantu",
         teks="Halaman berjudul 'Layanan Kami' yang memuat sepuluh jasa dalam satu halaman hampir selalu kalah di pencarian.\n\n"
              "Alasannya bukan soal panjang halaman, tapi soal relevansi. Ketika seseorang mencari satu jasa tertentu, mesin "
              "pencari butuh halaman yang membahas jasa itu secara utuh, lengkap dengan penjelasan, proses, dan pertanyaan "
              "yang sering muncul.\n\n"
              "Praktiknya: pecah halaman itu menjadi beberapa halaman, satu per layanan. Halaman lama tetap dipakai sebagai "
              "daftar dan pengumpul tautan.\n\n"
              "Berapa layanan yang Anda tawarkan sekarang, dan berapa di antaranya belum punya halaman sendiri? Boleh tulis "
              "di komentar.",
         tag="#seo #websitesbisnis #digitalmarketing"),
    dict(judul="Agen properti dan listing per lokasi",
         teks="Agen properti yang menurut kami paling rapi bekerja bukan yang paling rajin mengunggah foto, melainkan yang "
              "listinya punya halaman sendiri per unit dan per lokasi.\n\n"
              "Efeknya kelihatan di percakapan. Orang yang menghubungi sudah tahu lokasi, luas, dan harga, sehingga "
              "pertanyaannya lebih serius dibanding sekadar menanyakan masih ada atau tidak.\n\n"
              "Untuk yang menjual properti, ini juga menghemat waktu: percakapan yang tidak cocok tersaring lebih awal.\n\n"
              "Bagi yang bergerak di properti, apa yang paling sering membuat calon pembeli menghilang? Tulis pengalaman Anda "
              "di komentar.",
         tag="#properti #digitalmarketing #agenproperti"),
    dict(judul="Mitos konten harus tiap hari",
         teks="Sering muncul anggapan bahwa konten harus diunggah setiap hari, kalau tidak akun akan mati.\n\n"
              "Pengalaman kami, yang menentukan bukan frekuensinya, tapi apakah kontennya menjawab satu pertanyaan yang "
              "nyata. Akun yang mengunggah tiga kali sepekan dengan isi yang jelas biasanya lebih produktif daripada akun "
              "yang mengunggah tiap hari dengan topik yang berpindah-pindah.\n\n"
              "Yang perlu dijaga justru konsistensi jadwal, supaya audiens tahu kapan menunggu. Bukan jumlah unggahan.\n\n"
              "Seberapa sering Anda mengunggah sekarang, dan apakah jadwalnya tetap? Cerita di komentar.",
         tag="#kontenmarketing #sosmed #umkm"),
    dict(judul="Empat pertanyaan sebelum memilih vendor digital",
         teks="Sebelum menyerahkan pekerjaan pemasaran ke pihak lain, empat pertanyaan ini layak ditanyakan.\n\n"
              "Satu, siapa yang memiliki akun dan data, Anda atau vendornya. Dua, angka apa yang dilaporkan tiap bulan, "
              "apakah sampai ke biaya per prospek. Tiga, apa yang terjadi kalau kerja sama berhenti, apakah aset dan akses "
              "tetap milik Anda. Empat, siapa yang benar-benar mengerjakan pekerjaan rutinnya.\n\n"
              "Jawaban yang berbelit untuk pertanyaan pertama dan ketiga biasanya cukup jadi bahan pertimbangan.\n\n"
              "Adakah pertanyaan lain yang menurut Anda penting ditambahkan? Tulis di komentar.",
         tag="#digitalmarketing #bisnisonline #agensi"),
    dict(judul="Siapa yang pegang marketing",
         teks="Satu hal yang sering menentukan berhasil atau tidaknya pemasaran di usaha kecil: apakah ada satu orang yang "
              "bertanggung jawab.\n\n"
              "Kalau pekerjaan pemasaran dipegang bergantian oleh siapa pun yang sedang luang, biasanya tidak ada yang "
              "mengevaluasi, tidak ada yang memperbarui konten, dan anggaran berjalan tanpa arah. Bukan karena timnya tidak "
              "mampu, tapi karena tidak ada yang merasa memiliki.\n\n"
              "Yang dibutuhkan tidak selalu tim besar. Satu orang yang mengurus dua jam sehari secara konsisten sering lebih "
              "berguna daripada lima orang yang mengerjakan sesekali.\n\n"
              "Di bisnis Anda, siapa yang memegang ini sekarang? Boleh dibagi di komentar.",
         tag="#manajemenbisnis #digitalmarketing #umkm"),
    dict(judul="Waktu balas pertama",
         teks="Ada satu angka di bisnis yang sering luput dipantau meskipun paling murah diperbaiki: berapa lama rata-rata "
              "waktu menjawab percakapan baru.\n\n"
              "Di bisnis properti, bengkel, klinik, atau jasa apa pun, calon pelanggan biasanya menghubungi beberapa tempat "
              "dalam waktu yang berdekatan. Yang menjawab lebih dulu dengan informasi yang lengkap biasanya dapat percakapan "
              "lanjutan, terlepas dari harga.\n\n"
              "Kalau percakapan baru sering baru dijawab setelah beberapa jam, memperbaiki hal itu memberi hasil lebih cepat "
              "daripada menambah anggaran iklan.\n\n"
              "Bagaimana kebiasaan di bisnis Anda? Tulis di komentar, saya baca semuanya.",
         tag="#layananpelanggan #digitalmarketing #bisnis"),
    dict(judul="Pabrik menang lewat spesifikasi, bukan brosur",
         teks="Perusahaan manufaktur sering mengirim brosur PDF ke calon pembeli, padahal brosur itu tidak bisa ditemukan saat "
              "orang mencari.\n\n"
              "Yang bekerja justru sebaliknya: halaman produk berisi teks yang memuat ukuran, bahan, kapasitas, minimum order, "
              "dan sertifikat. Buyer perusahaan biasanya mencari angka sebelum menghubungi, dan kalau angka itu tidak ada di "
              "halaman Anda, mereka tidak akan pernah tahu Anda bisa mengerjakannya.\n\n"
              "Brosur tetap berguna, tapi posisinya setelah percakapan dimulai, bukan sebagai satu-satunya materi.\n\n"
              "Bagi yang bergerak di produksi, informasi teknis apa yang paling sering ditanyakan calon pembeli? Tulis di "
              "komentar.",
         tag="#manufaktur #b2b #digitalmarketing"),
    dict(judul="Iklan murah belum tentu untung",
         teks="Biaya per klik yang murah terdengar menyenangkan, tapi belum tentu menguntungkan.\n\n"
              "Yang menentukan adalah biaya per prospek, dan setelah itu biaya per penjualan. Klik murah yang datang dari "
              "orang yang tidak butuh bisa lebih mahal daripada klik mahal yang datang dari orang yang siap menghubungi.\n\n"
              "Cara paling sederhana membedakannya: tandai klik WhatsApp, telepon, dan formulir sebagai konversi, lalu "
              "bandingkan biaya per konversi antar kata kunci. Angka itu biasanya mengubah keputusan lebih banyak daripada "
              "laporan berisi jumlah klik.\n\n"
              "Pernah mengalami hal serupa? Bagikan di kolom komentar.",
         tag="#iklanonline #digitalmarketing #analitik"),
    dict(judul="Tiga angka yang cukup dipantau bulan ini",
         teks="Kalau laporan pemasaran terasa terlalu rumit, mulai dari tiga angka ini saja.\n\n"
              "Pertama, jumlah percakapan atau pengajuan yang masuk bulan ini. Kedua, dari kanal mana percakapan itu datang. "
              "Ketiga, biaya yang dikeluarkan untuk mendapatkannya.\n\n"
              "Tiga angka itu cukup untuk menjawab pertanyaan paling penting: kanal mana yang layak ditambah dan mana yang "
              "perlu dievaluasi. Angka lain bisa menyusul setelah tiga ini konsisten dicatat.\n\n"
              "Yang sering terjadi justru sebaliknya: alat analitik lengkap, tapi tiga angka ini tidak pernah dicatat rapi.\n\n"
              "Angka apa yang paling Anda andalkan sekarang? Tulis di komentar.",
         tag="#analitik #digitalmarketing #bisnis"),
    dict(judul="Pelanggan baru atau pelanggan lama",
         teks="Pertanyaan yang jarang dibahas padahal menentukan: mana yang lebih sulit, mencari pelanggan baru atau membuat "
              "pelanggan lama kembali?\n\n"
              "Dari pengalaman kami, yang kedua sering lebih murah tapi paling sering dilupakan. Banyak bisnis sibuk menambah "
              "anggaran iklan setiap bulan tanpa pernah menyapa ulang pelanggan yang sudah pernah membeli.\n\n"
              "Sentuhan sederhana seperti pengingat waktu pembelian berikutnya, kabar stok baru, atau penawaran khusus "
              "pelanggan lama biasanya memberi hasil yang jauh lebih besar dibanding biaya yang dikeluarkan.\n\n"
              "Menurut Anda, tim mana yang lebih kuat di bisnis Anda sekarang: pemburu pelanggan baru atau perawat pelanggan "
              "lama? Cerita di komentar.",
         tag="#retensi #umkm #digitalmarketing"),
    dict(judul="Soal mencantumkan harga",
         teks="Pertanyaan yang sering muncul: sebaiknya harga dicantumkan di website atau media sosial?\n\n"
              "Untuk layanan dan produk yang harganya bisa diperkirakan, mencantumkan angka atau rentang justru menyaring "
              "percakapan. Yang menghubungi biasanya yang sudah tahu kemampuannya, jadi waktunya lebih efisien untuk kedua "
              "belah pihak.\n\n"
              "Untuk proyek yang harganya bergantung spesifikasi, tulis faktor apa saja yang mempengaruhi harga. Pembaca "
              "tetap mendapat gambaran, tanpa Anda harus menyebut angka yang belum pasti.\n\n"
              "Yang sebaiknya dihindari: tidak ada satu pun petunjuk harga, karena pembaca biasanya menyimpulkan penjualnya "
              "belum serius.\n\n"
              "Kalau di bisnis Anda, harga dicantumkan atau tidak? Tulis alasannya di komentar.",
         tag="#harga #bisnisonline #digitalmarketing"),
    dict(judul="Klinik yang datang dari pencarian lokal",
         teks="Sebuah klinik yang sebelumnya hanya dikenal warga sekitar mulai mendapat pasien dari daerah yang lebih jauh "
              "setelah halaman per layanan dan profil lokasinya dirapikan.\n\n"
              "Yang berubah bukan iklannya, tapi kelengkapan informasinya: jam buka, layanan yang tersedia, alur pendaftaran, "
              "dan pertanyaan yang sering ditanyakan dijawab di halaman. Orang yang mencari jadi bisa memutuskan tanpa harus "
              "menelepon lebih dulu.\n\n"
              "Ini pelajaran yang berlaku di hampir semua layanan kesehatan: yang dicari orang adalah kepastian, bukan "
              "promosi.\n\n"
              "Bagi yang mengelola layanan kesehatan, informasi apa yang paling sering ditanyakan calon pasien? Boleh tulis di "
              "komentar.",
         tag="#klinik #seolokal #digitalmarketing"),
    dict(judul="Follower banyak bukan jaminan penjualan",
         teks="Jumlah pengikut memang enak dilihat, tapi jarang berhubungan langsung dengan penjualan.\n\n"
              "Akun dengan dua ribu pengikut yang sebagian besar berada di kota tempat Anda melayani biasanya memberi lebih "
              "banyak pelanggan daripada akun dengan dua puluh ribu pengikut yang tersebar di mana-mana. Apalagi untuk bisnis "
              "yang transaksinya butuh pertemuan, seperti properti, klinik, dan jasa perbaikan.\n\n"
              "Yang layak dipantau: berapa percakapan yang masuk, berapa yang berlanjut, dan berapa yang jadi.\n\n"
              "Apakah Anda pernah tergoda mengejar jumlah pengikut? Cerita pengalamannya di komentar.",
         tag="#sosmed #digitalmarketing #umkm"),
    dict(judul="Yang dicek di Search Console tiap bulan",
         teks="Search Console sering dibuka hanya saat ada masalah. Padahal tiga hal ini cukup dibaca tiap bulan untuk "
              "mengetahui arah konten berikutnya.\n\n"
              "Pertama, kata kunci yang memberi banyak tayangan tapi sedikit klik, tanda judul halaman perlu diperbaiki. "
              "Kedua, halaman yang posisinya mulai turun, biasanya karena informasi di dalamnya sudah usang. Ketiga, "
              "permintaan pencarian baru yang belum punya halaman sama sekali.\n\n"
              "Dari tiga itu, yang ketiga paling sering menghasilkan halaman baru yang langsung berguna.\n\n"
              "Kalau Anda pernah membuka Search Console, temuan apa yang paling mengejutkan? Tulis di komentar.",
         tag="#seo #searchconsole #digitalmarketing"),
    dict(judul="Kalau ada lima juta sebulan",
         teks="Pertanyaan yang sering kami ajukan ke pemilik usaha: kalau ada anggaran lima juta rupiah sebulan untuk "
              "pemasaran, dipakai ke mana?\n\n"
              "Jawaban kami biasanya dibagi tiga. Sebagian untuk merapikan dan mengisi halaman yang paling penting, supaya "
              "kedatangan orang tidak terbuang. Sebagian untuk iklan dengan kata kunci yang niatnya jelas, bukan yang "
              "jangkauannya luas. Sisanya untuk percobaan kecil di satu kanal, supaya tahu mana yang layak diperbesar.\n\n"
              "Yang sengaja kami hindari: membagi rata ke semua kanal sekaligus, karena tidak ada yang cukup untuk dinilai.\n\n"
              "Kalau Anda, akan dipakai ke mana? Tulis di komentar, menarik juga untuk dibandingkan.",
         tag="#anggaranmarketing #digitalmarketing #umkm"),
    dict(judul="Data pelanggan lama yang tidak pernah dibuka",
         teks="Hampir setiap bisnis punya aset yang jarang dipakai: daftar pelanggan dan calon pelanggan lama. Nomor "
              "WhatsApp yang pernah bertanya tahun lalu, pengunjung pameran, atau orang yang pernah meminta penawaran.\n\n"
              "Menghubungi mereka kembali jauh lebih murah daripada mencari orang baru, karena mereka sudah tahu siapa Anda. "
              "Yang perlu dijaga hanya relevansinya: kabar yang dikirim harus cocok dengan kebutuhan yang pernah mereka "
              "sebutkan. Empat sampai enam kali setahun biasanya cukup.\n\n"
              "Banyak yang merasa tidak punya daftar, padahal datanya ada di ponsel dan buku catatan, tinggal dirapikan.\n\n"
              "Apakah Anda menyimpan daftar semacam ini sekarang? Cerita di komentar.",
         tag="#datamarketing #crm #bisnis"),
    dict(judul="Toko retail yang mulai mencatat sumber pelanggan",
         teks="Sebuah toko retail kecil mulai mencatat satu kolom sederhana di buku pesanannya: pelanggan datang dari mana.\n\n"
              "Setelah sebulan, kelihatan hal yang tidak terduga. Ternyata yang paling banyak mendatangkan pembeli bukan "
              "iklan, tapi profil lokasi toko di peta dan kabar dari pelanggan lama. Anggaran iklan akhirnya digeser, dan "
              "hasilnya lebih baik.\n\n"
              "Pelajaran yang bisa dipakai siapa saja: satu kolom catatan sederhana bisa mengubah keputusan yang biasanya "
              "diambil berdasarkan perasaan.\n\n"
              "Di tempat Anda, apakah sumber pelanggan dicatat? Tulis pengalaman Anda di komentar.",
         tag="#retail #umkm #datamarketing"),
    dict(judul="Harus punya tim dulu baru jalan",
         teks="Ada anggapan bahwa pekerjaan pemasaran digital sebaiknya ditunda sampai punya tim internal yang lengkap.\n\n"
              "Menurut kami itu justru membuat bisnis kehilangan momentum. Yang dibutuhkan di awal bukan tim besar, tapi "
              "tiga hal: satu halaman yang menjelaskan apa yang Anda jual, satu cara menerima percakapan, dan satu catatan "
              "sederhana soal hasilnya.\n\n"
              "Ketiganya bisa dikerjakan sambil belajar, dan justru dari situ Anda tahu bagian mana yang paling layak "
              "diserahkan ke orang lain nanti.\n\n"
              "Kalau Anda pernah menunda karena alasan ini, apa yang akhirnya membuat keputusan berubah? Tulis di komentar.",
         tag="#umkm #digitalmarketing #bisnisonline"),
    dict(judul="Tanda halaman produk belum layak dipakai jualan",
         teks="Kalau halaman produk Anda memiliki ciri berikut, biasanya calon pembeli berhenti di tengah jalan.\n\n"
              "Tidak ada ukuran atau spesifikasi yang bisa dibaca, hanya foto. Tidak ada keterangan harga atau rentang "
              "harga. Tidak jelas cara memesan dan siapa yang menjawab. Tidak ada jawaban atas pertanyaan yang paling sering "
              "muncul.\n\n"
              "Perbaikannya tidak harus sekaligus. Mulai dari spesifikasi dan cara memesan, karena dua itu yang paling sering "
              "membuat orang mengurungkan niat.\n\n"
              "Menurut Anda, bagian mana yang paling sering dilewatkan penjual? Tulis di komentar.",
         tag="#produk #bisnisonline #digitalmarketing"),
    dict(judul="Kendala paling sering saat bikin konten",
         teks="Kalau ditanya apa kendala terbesar membuat konten, jawaban yang paling sering kami dengar bukan soal ide, "
              "tapi soal waktu.\n\n"
              "Karena itu kami biasa menyarankan cara yang sederhana: kumpulkan bahan dari percakapan pelanggan, lalu tulis "
              "beberapa konten sekaligus dalam satu waktu, dan jadwalkan tayangnya untuk beberapa hari ke depan. "
              "Mengerjakan sekaligus jauh lebih hemat waktu daripada memikirkan satu konten setiap hari.\n\n"
              "Bahannya sudah ada, karena pelanggan biasanya menanyakan hal yang sama berulang.\n\n"
              "Apa kendala terbesar Anda: ide, waktu, atau konsistensi? Tulis di komentar.",
         tag="#kontenmarketing #sosmed #umkm"),
    dict(judul="Keuangan: kejelasan biaya membangun kepercayaan",
         teks="Di jasa keuangan, materi pemasaran yang menyebut biaya, syarat, dan risiko apa adanya justru lebih dipercaya "
              "daripada yang hanya menonjolkan kemudahan.\n\n"
              "Calon nasabah zaman sekarang membandingkan dari beberapa sumber, dan yang mereka cari adalah kejelasan: "
              "berapa total biayanya, apa yang terjadi kalau telat bayar, dan bagaimana proses pengajuannya. Halaman yang "
              "menjawab tiga itu akan lebih banyak mendapat pengajuan yang serius.\n\n"
              "Ini juga membantu lembaga keuangan dari sisi lain: pengajuan yang masuk lebih layak, sehingga tim verifikasi "
              "tidak kelelahan menyaring yang tidak memenuhi syarat.\n\n"
              "Menurut Anda, informasi apa yang paling menentukan kepercayaan pada lembaga keuangan? Tulis di komentar.",
         tag="#keuangan #digitalmarketing #kepatuhan"),
    dict(judul="Menang lewat edukasi, bukan promosi",
         teks="Ada penyedia jasa keuangan yang hampir tidak pernah mengunggah promosi, isinya penjelasan: cara menghitung "
              "cicilan, apa bedanya bunga tetap dan mengambang, cara mengenali penawaran palsu.\n\n"
              "Hasilnya justru sebaliknya dari yang dikhawatirkan. Percakapan yang masuk lebih sedikit jumlahnya, tapi jauh "
              "lebih siap, karena orang yang menghubungi sudah paham produknya.\n\n"
              "Untuk layanan yang diputuskan sambil menghitung dan mempertimbangkan risiko, edukasi bekerja lebih baik "
              "daripada pancingan diskon.\n\n"
              "Setuju? Kalau punya contoh serupa dari industri lain, tulis di komentar.",
         tag="#keuangan #edukasi #digitalmarketing"),
    dict(judul="Satu pertanyaan yang mengubah banyak hal",
         teks="Kalau hanya boleh menambahkan satu kebiasaan di bisnis untuk memperbaiki pemasaran, kami memilih ini: "
              "menanyakan 'Bapak atau Ibu tahu tentang kami dari mana ya?' di awal setiap percakapan.\n\n"
              "Pertanyaan itu sederhana, dan jawabannya sering berbeda dari dugaan. Ada yang mengaku menemukan dari "
              "pencarian, ternyata awalnya melihat dari unggahan media sosial. Ada yang mengaku dari teman, ternyata "
              "sebelumnya melihat lokasinya di peta.\n\n"
              "Setelah dicatat selama sebulan, Anda punya gambaran yang lebih jujur soal kanal mana yang benar-benar bekerja.\n\n"
              "Apakah di bisnis Anda pertanyaan ini sudah dibiasakan? Tulis di komentar.",
         tag="#datamarketing #digitalmarketing #bisnis"),
    dict(judul="Properti: apa yang dicari orang sebelum membeli",
         teks="Sebelum memutuskan, calon pembeli properti hampir selalu mencari tiga informasi yang sama: harga di area itu "
              "berapa, akses jalan masuknya bagaimana, dan biaya tambahan di luar harga rumah.\n\n"
              "Kalau tiga hal itu tidak Anda sediakan, mereka akan mendapatkannya dari tempat lain, dan kemungkinan besar "
              "mereka menemukan penjual lain di halaman yang sama.\n\n"
              "Menyediakan halaman soal harga per area, foto akses jalan, dan rincian biaya balik nama adalah pekerjaan "
              "sekali, tapi dipakai bertahun-tahun dan terus mendatangkan pembaca.\n\n"
              "Bagi yang bergerak di properti, informasi mana yang paling sering ditanyakan? Tulis di komentar.",
         tag="#properti #digitalmarketing #seolokal"),
    dict(judul="Kenapa kami menulis panjang",
         teks="Kami sering menulis konten panjang bukan karena suka panjang, tapi karena beberapa pertanyaan memang butuh "
              "penjelasan utuh.\n\n"
              "Pertanyaan seperti cara memilih vendor, kenapa halaman tidak muncul di pencarian, atau bagaimana menyusun "
              "kampanye iklan, tidak bisa dijawab dalam dua kalimat tanpa menyesatkan. Yang membaca biasanya juga sedang "
              "membandingkan pilihan, jadi mereka justru ingin penjelasan.\n\n"
              "Kebalikannya juga berlaku. Untuk kabar promo dan pengumuman, teks pendek sudah cukup.\n\n"
              "Menurut Anda, konten panjang atau pendek yang biasanya membantu Anda mengambil keputusan? Boleh dibagikan di "
              "komentar.",
         tag="#kontenmarketing #bisnis #digitalmarketing"),
    dict(judul="Duplikat harga di banyak tempat",
         teks="Satu masalah kecil yang bisa merusak kepercayaan: harga yang berbeda antara website, marketplace, dan toko "
              "fisik.\n\n"
              "Pelanggan yang menemukan perbedaan sering bertanya-tanya mana yang berlaku, dan sebagian memilih pergi. "
              "Menjaga kesamaan harga dan ketersediaan sebenarnya soal kebiasaan: tentukan siapa yang memperbarui data, "
              "seberapa sering, dan pastikan tidak ada yang mengubah tanpa memberitahu yang lain.\n\n"
              "Untuk toko dengan beberapa cabang atau kanal penjualan, kebiasaan ini lebih penting daripada promosi apa pun.\n\n"
              "Apakah Anda pernah mengalami kendala ini? Cerita di komentar.",
         tag="#retail #umkm #bisnis"),
]

FALLBACK_TAG = "#digitalmarketing #seo #umkm"


def validasi(teks, judul):
    err = []
    if len(teks) < 250:
        err.append(f"terlalu pendek {len(teks)}")
    if len(teks) > 2000:
        err.append(f"kepanjangan {len(teks)}")
    if not re.search(r"komentar|diskusi|pendapat|bagikan|cerita|tulis di|pengalaman", teks[-220:], re.I):
        err.append("tanpa ajakan komentar di ekor")
    if "@" in teks:
        err.append("ada mention")
    bad = [t for t in re.findall(r"#(\w+)", teks) if t != t.lower()]
    if bad:
        err.append(f"hashtag kapital {bad}")
    cjk = [ch for ch in teks if "\u3000" <= ch <= "\u9fff" or "\uac00" <= ch <= "\ud7af"]
    if cjk:
        err.append(f"CJK {cjk[:3]}")
    return err


def semua_jadwal(c, account_id):
    out, page = [], 1
    while True:
        r = c.get_schedules(page=page, limit=100)
        docs = r.get("docs") or r.get("data") or []
        if not docs:
            break
        out.extend([d for d in docs if d.get("accountId") == account_id])
        if len(docs) < 100:
            break
        page += 1
    return out


def slot_harian(c, account_id, jumlah_hari):
    """Daftar slot: PER_HARI slot berbeda per hari, jam grid 7-slot, lompati yang sudah terisi."""
    sekarang = datetime.now(WIB)
    terpakai = set()
    for d in semua_jadwal(c, account_id):
        if d.get("status") not in ("pending", "draft", "processing"):
            continue
        sa = d.get("scheduleAt") or ""
        if len(sa) >= 13:
            terpakai.add(sa[:13])
    hasil, hari = [], sekarang.date()
    for _ in range(jumlah_hari * 2):
        if len(hasil) >= jumlah_hari * PER_HARI:
            break
        ambil = 0
        for jam in SLOTS_WIB:
            if ambil >= PER_HARI:
                break
            kandidat = datetime(hari.year, hari.month, hari.day, jam, 0, tzinfo=WIB)
            if kandidat <= sekarang + timedelta(minutes=20):
                continue
            kunci = kandidat.astimezone(timezone.utc).strftime("%Y-%m-%dT%H")
            if kunci in terpakai:
                continue
            terpakai.add(kunci)
            hasil.append(kandidat)
            ambil += 1
        hari += timedelta(days=1)
    return hasil


def muat_state():
    return json.load(open(STATE)) if os.path.exists(STATE) else {"posted": []}


def simpan_state(s):
    json.dump(s, open(STATE, "w"), indent=1, ensure_ascii=False)


def main():
    mode = sys.argv[1] if len(sys.argv) > 1 else "preview"
    jumlah = int(sys.argv[2]) if len(sys.argv) > 2 else len(BANK)
    state = muat_state()
    sisa = [b for b in BANK if b["judul"] not in {p["judul"] for p in state["posted"]}]

    if mode == "preview":
        hari = jumlah // PER_HARI
        print(f"bank {len(BANK)} post teks | rencana {jumlah} post = {PER_HARI}/hari x {hari} hari")
        for i, b in enumerate(sisa[:jumlah]):
            err = validasi(b["teks"], b["judul"])
            print(f"\n--- [{i+1}] {b['judul']} | {len(b['teks'])} char | {'OK' if not err else err}")
            print("    " + b["teks"].replace("\n", "\n    ")[:900])
        return

    c = get_client()
    slots = slot_harian(c, ACC_FB, (min(jumlah, len(sisa)) + PER_HARI - 1) // PER_HARI)
    print(f"slot tersedia: {len(slots)} -> {[s.strftime('%d %b %H:%M') for s in slots]}\n")
    dibuat = 0
    for b, slot in zip(sisa, slots):
        err = validasi(b["teks"], b["judul"])
        if err:
            print(f"  ⚠️ SKIP {b['judul']}: {err}")
            continue
        payload = {
            "accountId": ACC_FB,
            "title": f"StudioSoft — {b['judul']}"[:90],
            "topic": "Teks FB StudioSoft (insight & diskusi)",
            "type": "text",
            "description": b["teks"],
            "medias": [],
            "scheduleAt": slot.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z"),
            "replies": [],
        }
        try:
            res = c.post("/public/schedule", payload)
            sid = res.get("scheduleId") or res.get("_id") or res.get("id")
            print(f"  ✅ {slot.strftime('%d %b %H:%M')} WIB | {b['judul'][:46]} | id={sid}")
            state["posted"].append({"judul": b["judul"], "id": sid, "scheduleAt": payload["scheduleAt"]})
            simpan_state(state)
            dibuat += 1
        except ReplizError as e:
            print(f"  ❌ gagal {b['judul']}: {e}")
    print(f"\ntotal dibuat: {dibuat}")


if __name__ == "__main__":
    try:
        main()
    except ReplizError as e:
        print("ReplizError:", e)
        sys.exit(1)
