#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Isi slot kosong Threads @ukyhandoko & StudioSoft — FOKUS GROWTH FOLLOWER.
Strategi: variasi format (tips/cerita/opini/tanya/artikel+link), hook kuat,
ajakan interaksi, hashtag kecil, WAJIB ≤500 char (pakai pangkas_threads.batasi).
"""
import sys, json, urllib.request, os, random
from datetime import datetime, timedelta, timezone
sys.path.insert(0, "/home/mantapman/.openclaw/workspace-atun")
from repliz_client import HEADERS, BASE
from pangkas_threads import batasi

WIB = timezone(timedelta(hours=7))
SLOTS = [5, 8, 11, 14, 17, 20, 23]
UKY = "6a334e89c5ff4ce3a3225a48"
SS = "6a335b9ec5ff4ce3a3225c2a"
STATE = "/home/mantapman/.openclaw/workspace-atun/threads_growth_state.json"

# ── BANK KONTEN @ukyhandoko (personal brand: SEO, digital marketing, AI, bisnis) ──
UKY_TIPS = [
    "Kalau kamu jualan tapi nggak ada yang tahu, itu bukan masalah produk — tapi masalah visibilitas. 🎯\n\nSEO itu bukan sulap, tapi kebiasaan: riset kata kunci yang tepat, tulis konten yang menjawab, lalu ulangi tiap minggu.\n\nYang paling sering saya lihat: orang berhenti di minggu ke-3 karena belum lihat hasil. Padahal justru di situ titik baliknya.\n\nKamu sudah mulai SEO untuk bisnismu? Cerita di komentar! 👇",
    "3 kesalahan SEO yang bikin website kamu tenggelam: 🚨\n\n1. Nulis konten buat Google, bukan buat manusia\n2. Abaikan kecepatan website — padahal itu sinyal ranking\n3. Nggak pernah update konten lama yang mulai turun\n\nNomor 3 paling sering dilupakan, padahal paling gampang diperbaiki.\n\nKamu paling sering kena yang mana? Jawab di komentar! 👇",
    "AI itu bukan pengganti kamu. AI itu asisten yang bikin kamu kerja 3x lebih cepat. 🤖\n\nSaya pakai AI untuk riset, draft konten, dan analisis data — tapi ide dan strategi tetap dari manusia. Alat canggih tanpa arah cuma bikin cepat salah.\n\nYang penting bukan AI-nya, tapi gimana kamu pakai.\n\nKamu sudah pakai AI buat apa? Share di komentar! 👇",
    "Jangan tunggu website sempurna buat mulai jualan. 🚀\n\nWebsite pertama saya juga jauh dari bagus. Tapi justru dari situ saya belajar: pelanggan nggak butuh sempurna, mereka butuh solusi.\n\nYang penting: cepat diakses, jelas tawarannya, gampang dihubungi. Tiga itu aja udah bikin beda.\n\nApa yang bikin kamu nunda launch? Cerita di komentar! 👇",
    "Rahasia bisnis yang bertahan lama bukan modal besar, tapi konsistensi kecil yang nggak pernah putus. 📈\n\nKonten 3x seminggu selama setahun lebih kuat dari 30 konten sebulan lalu hilang. Algoritma suka yang hadir terus, pelanggan juga.\n\nKamu tim konsisten atau tim semangat 3 hari? Jujur di komentar! 👇",
    "Kalau kamu bingung mulai digital marketing dari mana: mulai dari satu hal aja. 🎯\n\nPilih satu: SEO, konten, atau iklan. Fokus 90 hari. Ukur hasilnya. Baru tambah yang lain.\n\nYang gagal biasanya karena mau semua sekaligus, akhirnya nggak ada yang jalan.\n\nKamu lagi fokus di mana sekarang? Komentar! 👇",
    "Data itu kunci bisnis digital. Tanpa data, kamu cuma nebak. 🔍\n\nCek 3 hal ini tiap minggu: siapa yang datang ke website, mereka cari apa, dan di halaman mana mereka pergi. Tiga data itu udah bisa ngarahin strategi kamu.\n\nKamu rutin cek data atau masih feeling? Jujur! 👇",
    "Follower itu bukan target utama — kepercayaan yang jadi target. ✨\n\n1.000 follower yang percaya lebih berharga dari 10.000 yang cuma lewat. Cara bangunnya: konsisten kasih nilai, jangan cuma jualan.\n\nOrang follow karena merasa dibantu, bukan diganggu.\n\nSetuju? Kasih pendapatmu di komentar! 👇",
    "Website yang lambat itu kayak toko yang pintunya susah dibuka. ☕\n\nOrang batal masuk, apalagi kalau ada pilihan lain. 3 detik pertama paling menentukan. Kecepatan website bukan soal teknis — soal pengalaman pelanggan.\n\nWebsite kamu kalau dibuka di HP, cepat atau lemot? Cek dulu, cerita di komentar! 👇",
    "Hal yang saya sesali di awal karier: terlalu lama diam karena takut salah. 😅\n\nSekarang saya paham: salah itu bagian dari proses. Yang penting salahnya murah, cepat diperbaiki, dan nggak diulang.\n\nStop overthinking. Mulai aja, perbaiki sambil jalan.\n\nApa hal yang kamu tunda karena takut salah? Cerita di komentar! 👇",
]

UKY_QUESTIONS = [
    "Pertanyaan buat pebisnis di sini: 👋\n\nKalau budget cuma Rp1 juta sebulan buat digital marketing, kamu alokasikan ke mana?\n\nA. Iklan berbayar\nB. Jasa konten\nC. SEO\nD. Tools & website\n\nJawab A/B/C/D + alasannya di komentar. Paling menarik nanti saya bahas! 👇",
    "Jujur deh: bisnismu sekarang udah ada website, tapi yang nemu dari Google ada berapa? 🤔\n\nKalau jawabannya nol — jangan panik. Banyak yang sama. Bedanya, yang mau belajar SEO pelan-pelan bakal unggul.\n\nAngkat tangan kalau kamu tim 'website ada tapi sepi' 🙋 Cerita di komentar! 👇",
    "Saya mau tanya: menurut kamu, apa yang paling bikin orang beli? 👀\n\nA. Harga murah\nB. Kualitas produk\nC. Kepercayaan ke brand\nD. Rekomendasi orang lain\n\nJawabanmu bikin saya ngerti pasar lebih baik. Tulis di komentar ya! 👇",
    "Coba sebutkan 1 kebiasaan kecil yang paling ngaruh ke bisnismu. 👇\n\nMilik saya: cek data tiap Senin pagi — 15 menit aja. Dari situ saya tahu harus fokus ke mana minggu ini.\n\nKamu punya kebiasaan apa yang bikin bisnis lebih terkendali? Share! 👇",
    "Kalau kamu bisa nanya 1 hal ke pakar SEO, mau nanya apa? 🎤\n\nSaya bakal jawab sebanyak mungkin di komentar. Jadi tulis pertanyaanmu sekarang!\n\nYang paling sering ditanya nanti saya bikin thread khusus. 👇",
]

# ── BANK KONTEN StudioSoft (agency: digital marketing & SEO) ──
SS_TIPS = [
    "3 hal yang wajib ada di website bisnis kamu: ✅\n\n1. Kecepatan di bawah 3 detik\n2. Halaman yang jelas menawarkan solusi\n3. Kontak yang gampang ditemukan\n\nSederhana, tapi 80% website bisnis melewatkan salah satunya.\n\nWebsite kamu sudah punya ketiganya? Cek dan cerita di komentar! 👇",
    "SEO itu bukan biaya, tapi aset. 💡\n\nIklan berhenti saat budget habis. SEO terus bekerja 24 jam — dari artikel yang kamu tulis setahun lalu pun masih bisa mendatangkan pelanggan.\n\nYang perlu diubah: cara pandang kita, bukan cuma tekniknya.\n\nKamu masih lihat SEO sebagai biaya? Diskusi di komentar! 👇",
    "Calon pelanggan kamu mencari 'dekat saya' di HP setiap hari. 📍\n\nKalau bisnis kamu nggak muncul di Google Maps dengan profil lengkap — mereka langsung pindah ke kompetitor.\n\nGoogle Business Profile itu gratis. Isi lengkap: foto, jam buka, layanan, dan review.\n\nSudah lengkap belum profil bisnismu? Cerita di komentar! 👇",
    "Konten yang bagus itu bukan yang paling panjang, tapi yang paling menjawab. 🎯\n\nSebelum nulis, tanya dulu: pertanyaan apa yang sering ditanya pelanggan? Jawaban itu yang jadi konten.\n\nKonten yang relevan selalu menang dari konten yang sekadar rutin.\n\nTopik apa yang paling sering ditanya pelangganmu? Share! 👇",
    "Website tanpa persona brand itu kayak orang tanpa nama. 🪪\n\nYang bikin orang ingat bukan cuma produk, tapi bagaimana kamu membuat mereka merasa. Mulai dari warna konsisten, gaya bahasa, sampai cara membalas chat.\n\nBranding itu detail detail kecil yang diulang.\n\nBrand kamu sudah punya ciri khas belum? Diskusi! 👇",
    "Mit atau fakta: SEO bisa hasil dalam seminggu? ❌\n\nFaktanya: butuh waktu 3-6 bulan untuk hasil stabil. Yang janji seminggu itu red flag.\n\nSEO itu investasi jangka panjang — seperti menanam, bukan langsung panen.\n\nPernah ditawari janji hasil instan? Cerita di komentar! 👇",
    "3 metrik yang wajib kamu pantau tiap bulan: 📊\n\n1. Traffic organik (dari pencarian)\n2. Peringkat kata kunci utama\n3. Konversi (pengunjung jadi pelanggan)\n\nKalau cuma pantau follower, kamu bakal salah ambil keputusan.\n\nKamu rutin pantau yang mana? Cerita! 👇",
    "Konten tidak harus viral buat mendatangkan pelanggan. 🎯\n\nKonten yang tepat ke orang yang tepat jauh lebih berharga dari konten viral tapi salah sasaran. Fokus ke kebutuhan audiens, bukan ke angka.\n\nMending 100 pembaca yang benar daripada 10.000 yang nggak butuh.\n\nSetuju? Diskusi di komentar! 👇",
]

def get_pending(accid):
    out = []
    for p in range(1, 90):
        raw = urllib.request.Request(f"{BASE}/public/schedule?page={p}&limit=100", headers=HEADERS)
        with urllib.request.urlopen(raw, timeout=30) as r:
            docs = json.load(r)["docs"]
        for d in docs:
            if d.get("accountId") == accid and (d.get("status") or "").lower() == "pending":
                out.append(d)
    return out

def next_free(accid, day_start, taken):
    day = day_start
    for _ in range(20):
        for h in SLOTS:
            cand = day.replace(hour=h)
            if cand <= datetime.now(WIB):
                continue
            key = cand.strftime("%Y-%m-%d %H")
            if key not in taken:
                return cand
        day += timedelta(days=1)
    return None

def create(accid, cap, at, title, topic):
    payload = {
        "accountId": accid, "title": title, "description": batasi(cap),
        "topic": topic, "type": "text", "medias": [],
        "scheduleAt": at, "replies": [],
    }
    req = urllib.request.Request(f"{BASE}/public/schedule",
                                 data=json.dumps(payload).encode(),
                                 headers={**HEADERS, "Content-Type": "application/json"})
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.load(r)

def main():
    n_per = int(sys.argv[1]) if len(sys.argv) > 1 else 30
    st = json.load(open(STATE)) if os.path.exists(STATE) else {"uky_used": [], "ss_used": []}

    plan = [(UKY, UKY_TIPS + UKY_QUESTIONS, "uky_used", "SEO & Bisnis"), (SS, SS_TIPS, "ss_used", "Digital Marketing")]
    total_ok = total_fail = 0
    for accid, bank, used_key, topic in plan:
        pend = get_pending(accid)
        taken = set()
        for d in pend:
            at = d.get("scheduleAt") or ""
            try:
                dt = datetime.fromisoformat(at.replace("Z", "+00:00")).astimezone(WIB)
                taken.add(dt.strftime("%Y-%m-%d %H"))
            except Exception:
                continue
        used = set(st.get(used_key, []))
        avail = [x for x in bank if x[:40] not in used]
        random.shuffle(avail)
        print(f"=== {accid[:8]} | bank tersedia: {len(avail)} | isi maks {n_per} ===")
        day = datetime.now(WIB).replace(minute=0, second=0, microsecond=0)
        for cap in avail[:n_per]:
            slot = next_free(accid, day, taken)
            if slot is None:
                print("  ⚠️ slot habis")
                break
            taken.add(slot.strftime("%Y-%m-%d %H"))
            at = slot.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")
            try:
                create(accid, cap, at, f"Threads Growth — {topic}", topic)
                total_ok += 1
                st.setdefault(used_key, []).append(cap[:40])
                print(f"  ✅ {slot.strftime('%d/%m %H:00')} WIB | {cap[:50].replace(chr(10),' ')}")
            except Exception as e:
                total_fail += 1
                print(f"  ❌ {e}")
        with open(STATE, "w") as f:
            json.dump(st, f, indent=1, ensure_ascii=False)
    print(f"\n📊 Total: {total_ok} OK, {total_fail} gagal")

if __name__ == "__main__":
    main()
