#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Threads HARIAN @ukyhandoko + StudioSoft — 5 slot per hari, tiap slot main + 1 reply.
Komposisi per hari:
  08:00 WIB  StudioSoft  — ARTIKEL website (link studiosoft.id)
  11:00 WIB  @ukyhandoko — QUOTES personal/bisnis (gaya kemarin)
  14:00 WIB  StudioSoft  — IMAGE dari server (IG StudioSoft)
  17:00 WIB  @ukyhandoko — QUOTES personal/bisnis
  20:00 WIB  StudioSoft  — konten DM/SEO (artikel/tips)
Anti-redundant: link & image tidak boleh dipakai ulang. Tanpa mention antar akun.
"""
import sys, os, json, re
from datetime import datetime, timedelta, timezone

sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import ReplizClient, ACC

WIB = timezone(timedelta(hours=7))
ROOT = "/home/mantapman/.hermes/profiles/atun/workspace"
STATE = os.path.join(ROOT, "threads_uky_ss_state.json")
IMG_BASE = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"

UKY_T = ACC.UKY_THREADS
SS_T = ACC.STUDIOSOFT_THREADS

# ── Artikel live belum dipakai (dari scan sebelumnya) ──
ARTICLES = [
    ("Cara Kelola Banyak Akun Media Sosial dengan AI Personal Assistant", "https://studiosoft.id/kelola-banyak-akun-media-sosial-dengan-ai-personal-assistant"),
    ("5 Keunggulan Optimasi AI Overview Google untuk Bisnis Lokal Surabaya", "https://studiosoft.id/5-keunggulan-optimasi-ai-overview-google-bisnis-lokal-surabaya"),
    ("6 Skill Wajib Belajar Digital Marketing untuk Pemula di 2026", "https://studiosoft.id/6-skill-wajib-untuk-belajar-digital-marketing-bagi-pemula-di-tahun-2026"),
    ("6 Tips Memilih Jasa Digital Marketing Surabaya", "https://studiosoft.id/6-tips-memilih-jasa-digital-marketing-surabaya"),
    ("6 Tren SEO 2026 yang Wajib Dikuasai Pebisnis", "https://studiosoft.id/6-tren-seo-2026-yang-wajib-dikuasai-pebisnis-malang"),
    ("7 Alasan Landing Page Penting untuk Konversi Bisnis Online", "https://studiosoft.id/7-alasan-landing-page-penting-untuk-tingkatkan-konversi-bisnis-online"),
    ("7 Cara Menggunakan AI untuk Riset Kata Kunci", "https://studiosoft.id/7-cara-menggunakan-ai-untuk-riset-kata-kunci-yang-lebih-cepat-dan-akurat"),
    ("7 Langkah Belajar Digital Marketing dari Nol Sampai Mahir", "https://studiosoft.id/7-langkah-belajar-digital-marketing-untuk-pemula-dari-nol-sampai-mahir"),
    ("7 Strategi Digital Marketing Surabaya untuk UMKM", "https://studiosoft.id/7-strategi-digital-marketing-surabaya-umkm"),
    ("7 Tips Mendapatkan Backlink Berkualitas untuk SEO", "https://studiosoft.id/7-tips-mendapatkan-backlink-berkualitas-untuk-optimasi-seo-website"),
    ("8 Alasan Jasa Website Surabaya Profesional adalah Investasi Wajib", "https://studiosoft.id/8-alasan-mengapa-jasa-website-surabaya-profesional-adalah-investasi-wajib-untuk-bisnis-anda"),
    ("8 Manfaat Jasa Digital Marketing Surabaya", "https://studiosoft.id/8-manfaat-jasa-digital-marketing-surabaya"),
    ("AI Agent: Apa Itu dan Bagaimana Mengubah Cara Bisnis Bekerja", "https://studiosoft.id/ai-agent-apa-itu-dan-bagaimana-mengubah-cara-bisnis-bekerja"),
    ("Apa Itu Guerilla Marketing: Strategi Iklan Kreatif Modal Kecil", "https://studiosoft.id/apa-itu-guerilla-marketing-strategi-iklan-kreatif-modal-kecil"),
    ("Bagaimana AI Mengubah Algoritma Google dan Strategi SEO", "https://studiosoft.id/bagaimana-ai-mengubah-algoritma-google-dan-strategi-seo-anda"),
    ("Core Web Vitals: Kunci Kecepatan Website Naik Peringkat 2026", "https://studiosoft.id/core-web-vitals-kecepatan-website-2026"),
    ("Jasa Pembuatan Website Surabaya", "https://studiosoft.id/jasa-pembuatan-website-surabaya"),
    ("Kopdar SUMU Sidoarjo: Website & SEO Kunci UMKM Naik Kelas", "https://studiosoft.id/kopdar-sumu-sidoarjo-big-deal-big-opportunity-website-seo-kunci-umkm-naik-kelas"),
    ("Mengapa Optimasi AI Overview Google Investasi Bisnis Surabaya 2026", "https://studiosoft.id/mengapa-jasa-optimasi-ai-overview-google-investasi-bisnis-surabaya-2026"),
    ("Perbedaan On-Page dan Off-Page SEO", "https://studiosoft.id/perbedaan-onpage-offpage-seo"),
    ("Social Media Marketing UMKM Budget Minim", "https://studiosoft.id/social-media-marketing-umkm-budget-minim"),
    ("Strategi Guerilla Marketing untuk UMKM", "https://studiosoft.id/strategi-guerilla-marketing-umkm"),
]

# ── Image IG StudioSoft di server yang BELUM dipakai di Threads ──
SS_IMAGES = [
    ("01_cover.jpg", "Digital Marketing Agency Surabaya"),
    ("02_kenapa.jpg", "Kenapa Website Penting"),
    ("03_keuntungan.jpg", "Keuntungan Punya Website"),
    ("04_langkah.jpg", "Langkah Mulai Digital Marketing"),
    ("05_cta.jpg", "Konsultasi Gratis StudioSoft"),
    ("ss_hc20_edukasi_01_cover.jpg", "Edukasi Digital Marketing"),
    ("ss_hc20_edukasi_02_kenapa.jpg", "Kenapa Perlu Edukasi"),
    ("ss_hc20_edukasi_03_isi.jpg", "Materi Edukasi"),
    ("ss_hc20_edukasi_04_langkah.jpg", "Langkah Edukasi"),
    ("ss_hc20_edukasi_05_cta.jpg", "Hubungi StudioSoft"),
]

# ── Quotes @ukyhandoko (personal, quotes hidup × bisnis/AI/DM/SEO) ──
UKY_QUOTES = [
    ("Bisnis itu seperti tanaman: kalau cuma disiram sekali, jangan harap tumbuh. Perlu perawatan rutin — konten, promosi, pelayanan — biar makin kuat akarnya. 🌱\n\nSaya sering lihat orang berhenti di tengah jalan padahal tinggal selangkah lagi. Padahal yang konsisten itu yang menang, bukan yang paling pintar.\n\nBisnismu lagi di fase apa sekarang? Cerita di komentar yuk 👇",
     "Konsistensi memang terlihat sepele, tapi dari situlah kepercayaan pelanggan dibangun. Percaya? 👍"),
    ("Orang tidak ingat persis apa yang kamu jual. Mereka ingat bagaimana kamu membuat mereka merasa. ❤️\n\nItulah kenapa personal branding penting — bukan soal pamer, tapi soal kesan yang kamu tinggalkan. Saya selalu bilang: jualan itu urusan belakangan, kepercayaan duluan.\n\nAda brand yang bikin kamu merasa dihargai? Sebutin di komentar! 💬",
     "Kesan pertama memang cepat hilang kalau tidak dirawat. Setuju? 😊"),
    ("SEO itu seperti menanam pohon: hari ini kelihatan tidak ada hasil, tapi 6 bulan lagi rindang. 🌳\n\nBanyak yang menyerah di bulan kedua karena belum lihat hasil. Padahal justru di situlah kebanyakan orang berhenti — dan yang bertahan yang panen.\n\nKamu lagi sabar nunggu hasil apa? Share di komentar! 👇",
     "Yang sabar biasanya dapat hasil lebih manis. Betul kan? 😄"),
    ("Modal terbesar bisnis bukan uang, tapi keberanian mulai dan ketekunan bertahan. 💪\n\nSaya dulu juga ragu-ragu. Tapi pengalaman saya: lebih baik coba dan belajar, daripada diam dan menyesal. Kesalahan itu biaya kursus, bukan kegagalan.\n\nApa hal pertama yang bikin kamu berani mulai bisnis? Cerita dong! 👇",
     "Setiap yang besar selalu mulai dari langkah kecil yang berani. 🔥"),
    ("AI bukan pengganti kamu — AI itu seperti kacamata buat yang rabun: bikin kamu makin jelas lihat peluang. 👓\n\nYang tidak mau belajar AI akan tertinggal, bukan karena digantikan, tapi karena yang lain sudah lebih cepat. Saya pakai AI untuk riset, konten, dan analisis — hasilnya kerja lebih ringan, output lebih banyak.\n\nKamu sudah pakai AI buat apa? Share di sini! 🚀",
     "Yang penting bukan takutnya, tapi seberapa cepat kamu adaptasi. Setuju? 😎"),
    ("Gagal itu bukan lawan, tapi guru paling jujur. 📚\n\nSetiap kesalahan bisnis yang saya alami, saya catat dan jadikan pelajaran. Yang penting bukan tidak pernah jatuh, tapi selalu bangun lagi dengan cara yang lebih baik.\n\nPernah gagal tapi jadi pelajaran berharga? Ceritakan di komentar! 👇",
     "Dari gagal kita tahu mana yang harus diperbaiki. 🙌"),
    ("Bisnis yang sehat itu bukan yang paling ramai, tapi yang paling jelas identitasnya. 🧭\n\nBranding itu bukan sekadar logo bagus — tapi seberapa jelas orang ingat kamu ngapain dan kenapa harus pilih kamu. Kalau kamu sendiri bingung positioning, orang lain pasti makin bingung.\n\nBisnismu punya identitas yang jelas belum? 👇",
     "Brand yang kuat lahir dari kejelasan, bukan keramaian. 👍"),
    ("Jangan tunggu sempurna untuk mulai — karena sempurna itu mitos. Mulai aja dulu, perbaiki seiring jalan. ✨\n\nKonten pertama saya juga jauh dari bagus. Tapi kalau tidak pernah mulai, tidak akan pernah ada konten kedua yang lebih baik. Progress > perfection.\n\nApa yang kamu tunda-tunda mulainya? Komentar di bawah! 👇",
     "Mulai dulu, sempurna kemudian. Itu kuncinya! 😊"),
    ("Konsistensi mengalahkan bakat yang cuma kadang-kadang. 🏃\n\nSaya lebih percaya orang yang muncul rutin dengan usaha stabil, daripada orang jenius yang hilang-hilangan. Di digital marketing pun sama — algoritma menyukai yang konsisten.\n\nKamu tim konsisten atau tim semangat 3 hari? Jujur ya! 😄",
     "Tidak perlu hebat tiap hari, cukup jangan berhenti. 🙏"),
    ("Kadang yang paling sulit bukan mencari pelanggan, tapi menjaga yang sudah ada. 🤝\n\nPelanggan lama yang puas itu aset paling mahal — mereka datang lagi dan bawa cerita baik ke mana-mana. Lebih murah merawat daripada terus mencari yang baru.\n\nApa cara kamu menjaga pelanggan tetap loyal? Share! 👇",
     "Retensi itu marketing paling murah dan paling jujur. 👍"),
    ("Hidup itu seperti website: kalau loading-nya lambat, orang pergi sebelum lihat isinya. ⚡\n\nKecepatan, kejelasan, dan pengalaman — itu yang bikin orang betah. Sama seperti hidup, orang bertahan di tempat yang nyaman dan jelas arahnya.\n\nAda bagian hidupmu yang perlu 'dipercepat'? Cerita yuk! 👇",
     "Intinya: jangan bikin orang nunggu terlalu lama. 😄"),
    ("Data itu seperti lampu di jalan gelap: tanpa data, kita cuma menebak. 🔦\n\nSaya selalu mulai dari data — siapa targetnya, mereka cari apa, dan di mana mereka berada. Keputusan berdasarkan data lebih tenang, karena bukan perasaan belaka.\n\nKamu tim tebak-tebakan atau tim data? 👇",
     "Tebakan boleh, tapi data tidak bohong. 👍"),
    ("Waktu itu satu-satunya modal yang tidak bisa dibeli. Jadi pakai dengan bijak — fokus ke hal yang mendatangkan hasil. ⏳\n\nSaya dulu sibuk segala hal sampai lupa mana yang penting. Sekarang saya belajar: tidak semua kesempatan harus diambil, yang benar saja.\n\nApa yang paling menyita waktumu akhir-akhir ini? Cerita di komentar! 👇",
     "Fokus itu pilihan, bukan kebetulan. 😊"),
    ("Orang lebih percaya bukti daripada janji. 🧾\n\nMakanya saya selalu tampilkan hasil, testimoni, dan proses — biar calon klien lihat sendiri. Bukan cuma bilang 'pasti bagus', tapi tunjukkan kenapa.\n\nPernah memilih produk karena lihat bukti hasilnya? Share! 👇",
     "Bukti kecil lebih kuat daripada janji besar. 👍"),
    ("Jaringan itu seperti otot: makin sering dilatih, makin kuat. 🏋️\n\nRelasi tidak dibangun sekali kenalan, tapi lewat follow-up yang tulus. Saya selalu sisihkan waktu untuk menyapa kenalan lama — siapa tahu jadi peluang.\n\nKamu orangnya rajin maintain relasi atau baru ingat kalau butuh? Jujur! 😄",
     "Relasi yang dirawat akan merawat kita balik. 🙏"),
    ("Harga diri bisnis itu bukan di seberapa besar modalnya, tapi di seberapa konsisten janjinya ditepati. 🤝\n\nPelanggan tidak butuh sempurna — mereka butuh bisa diandalkan. Datang tepat waktu, hasil sesuai janji, komunikasi jujur. Itu sudah beda banget.\n\nApa janji yang paling kamu pegang di bisnismu? 👇",
     "Konsistensi janji = reputasi. Itu hukum bisnis. 😊"),
]

# ── Caption StudioSoft: artikel ──
def caption_artikel(judul, url):
    return (
        f"Baru baca artikel menarik dari StudioSoft: {judul}. 📖\n\n"
        f"Masih banyak pebisnis yang belum sadar, padahal ini bisa jadi pembeda antara website yang sepi dan website yang menghasilkan. Saya coba rangkum poin pentingnya biar kamu tidak perlu baca semuanya — tapi kalau mau detail, langsung klik link-nya aja. 😉\n\n"
        f"{url}\n\n"
        f"Menurut kamu, mana yang paling relate sama kondisi bisnismu? Tulis di komentar ya! 👇\n\n"
        f"#StudioSoft #DigitalMarketing #SEO #BisnisSurabaya"
    )

# ── Caption StudioSoft: image ──
def caption_image(tema, fn):
    return (
        f"{tema} — ini salah satu materi yang sering kami bagikan ke klien StudioSoft. 🎯\n\n"
        f"Intinya sederhana: bisnis yang mau berkembang butuh fondasi digital yang benar. Bukan cuma punya website, tapi website yang ditemukan orang dan mengubah pengunjung jadi pelanggan.\n\n"
        f"Kalau bisnismu masih sepi dari internet, mungkin ini saatnya dibenahi. Konsultasi gratis dulu, nggak ada salahnya. 😊\n\n"
        f"Menurut kamu, bagian mana yang paling susah dari membangun kehadiran online? Yuk diskusi di komentar! 👇\n\n"
        f"#StudioSoft #DigitalMarketing #WebsiteSurabaya #SEO"
    )

# ── Caption StudioSoft: konten DM/SEO malam (tanpa image, pakai angle tips) ──
SS_EVENING = [
    ("Tips memilih jasa SEO itu gampang-gampang susah. Yang penting jangan tergiur harga murah tapi prosesnya tidak jelas. Pastikan mereka transparan: lapor rutin, teknik yang sesuai algoritma, dan hasil yang realistis. 🎯\n\nSaya selalu sarankan mulai dari audit dulu — biar tahu sebenarnya website kamu bermasalah di mana. Jangan asal beli paket.\n\nPernah salah pilih jasa SEO? Cerita pengalamannya di komentar! 👇\n\n#StudioSoft #JasaSEO #SEOIndonesia",
     "Audit dulu, baru beli paket. Itu cara paling aman. 👍"),
    ("Website itu etalase 24 jam bisnismu. Kalau etalasenya berantakan, orang tidak akan masuk — sama kayak toko fisik yang kotor. 🏪\n\nFondasinya: cepat dibuka, rapi di HP, jelas tawaran apa, dan gampang dihubungi. Empat itu saja sudah bikin beda besar.\n\nWebsite kamu sudah memenuhi 4 hal itu belum? Cek dan cerita di komentar! 👇\n\n#StudioSoft #WebsiteBisnis #DigitalMarketing",
     "Kecepatan + kejelasan = kredibilitas. Itu hukumnya. 😄"),
    ("Konten itu bukan sekadar nulis rutin — tapi nulis hal yang orang cari. 🔍\n\nRiset kata kunci dulu, baru nulis. Kalau cuma nulis sesuai selera sendiri, percuma — tidak ada yang nemuin. Saya selalu mulai dari pertanyaan: orang lagi cari apa?\n\nKamu nulis konten berdasarkan riset atau feeling aja? Jujur! 👇\n\n#StudioSoft #KontenSEO #DigitalMarketing",
     "Konten tanpa riset itu seperti panah tanpa target. 🎯"),
    ("AI sekarang bisa bantu banyak hal di bisnis: riset, konten, jawab chat pelanggan, sampai analisis. Tapi AI tetap butuh arahan manusia yang paham strategi. 🤖\n\nYang menang bukan yang paling canggih pakai AI, tapi yang paling jeli memanfaatkannya untuk kebutuhan bisnisnya.\n\nBagian bisnis kamu yang sudah dibantu AI? Share di komentar! 🚀\n\n#StudioSoft #AIBisnis #DigitalMarketing",
     "AI itu alat, strategi tetap dari manusia. Setuju? 😊"),
    ("Google itu seperti kasir yang sibuk: dia layani dulu yang antreannya rapi dan relevan. Kalau website kamu lambat atau kontennya asal, ya disuruh antre paling belakang. 🏪\n\nSEO itu bukan sulap — ini soal konsistensi teknis + konten + pengalaman pengguna. Pelan tapi pasti hasilnya nyata.\n\nWebsite kamu sudah ramah Google belum? Komentar di bawah! 👇\n\n#StudioSoft #SEO #GoogleRanking",
     "SEO itu maraton, bukan sprint. Sabar aja. 💪"),
    ("Website itu cermin bisnismu — kalau berantakan, orang langsung ilfeel. Jaga selalu: cepat, rapi, jelas. 🪞\n\nFondasi digital yang benar itu investasi jangka panjang, bukan pengeluaran. Yang ragu-ragu biasanya ketinggalan duluan.\n\nWebsite kamu udah enak dilihat belum? Komentar di bawah! 👇\n\n#StudioSoft #WebsiteBisnis #DigitalMarketing",
     "Kesan pertama dari website itu penentu. Setuju? 😊"),
    ("Banyak UMKM yang sudah punya website tapi tetap sepi — karena website-nya tidak ditemukan orang. 🔍\n\nSEO itu yang bikin website ketemu, bukan cuma dibikin. Dua-duanya harus jalan: website bagus + dioptimasi biar muncul di Google.\n\nWebsite kamu sudah muncul di halaman 1 Google belum? Cek & cerita! 👇\n\n#StudioSoft #SEO #UMKMNaikKelas",
     "Website tanpa SEO itu seperti toko di gang buntu. 😄"),
]

def load_state():
    if os.path.exists(STATE):
        with open(STATE) as f:
            return json.load(f)
    return {"used_links": [], "used_images": [], "used_quotes": [], "used_evening": [], "days_done": []}

def save_state(st):
    with open(STATE, "w") as f:
        json.dump(st, f, indent=1, ensure_ascii=False)

def pick_unused(pool, used, key_fn):
    for item in pool:
        k = key_fn(item)
        if k not in used:
            return item
    return None

def main():
    days = int(sys.argv[1]) if len(sys.argv) > 1 else 7
    start = datetime.now(WIB).replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1)
    st = load_state()
    client = ReplizClient()
    ok = fail = 0

    print(f"📅 Jadwal Threads harian {days} hari mulai {start.strftime('%d/%m/%Y')} — @ukyhandoko + StudioSoft")
    print(f"   (5 slot/hari, tiap slot main + 1 reply, anti-redundant)\n")

    for d in range(days):
        tgl = start + timedelta(days=d)
        ds = tgl.strftime("%Y-%m-%d")
        if ds in st["days_done"]:
            continue

        # pilih konten unik
        art = pick_unused(ARTICLES, st["used_links"], lambda x: x[1])
        img = pick_unused(SS_IMAGES, st["used_images"], lambda x: x[0])
        q1 = pick_unused(UKY_QUOTES, st["used_quotes"], lambda x: x[0][:40])
        # q2 harus BEDA dari q1 (fix duplikat 1 Sep 2026)
        q2_pool = [q for q in UKY_QUOTES if q[0][:40] != (q1[0][:40] if q1 else None)]
        q2 = pick_unused(q2_pool, st["used_quotes"], lambda x: x[0][:40])
        ev = pick_unused(SS_EVENING, st["used_evening"], lambda x: x[0][:40])
        if not all([art, img, q1, q2, ev]):
            print(f"  ⚠️  {ds}: stok habis, stop. {art=} {img=} {q1=} {q2=} {ev=}")
            break

        slots = [
            ("SS-artikel", SS_T, caption_artikel(art[0], art[1]), "Baca sampai habis ya, ada insight menarik di dalamnya. 📖"),
            ("UKY-quotes1", UKY_T, q1[0], q1[1]),
            ("SS-image", SS_T, caption_image(img[1], img[0]), "Simpan dulu, siapa tahu berguna buat bisnismu nanti. 📌", img[0]),
            ("UKY-quotes2", UKY_T, q2[0], q2[1]),
            ("SS-evening", SS_T, ev[0], ev[1]),
        ]
        # jam WIB
        hours = [8, 11, 14, 17, 20]

        for (label, accid, main_text, reply_text, *img_opt), hour in zip(slots, hours):
            schedule_at = tgl.replace(hour=hour, minute=0, tzinfo=WIB).astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")
            medias = None
            if img_opt:
                fn = img_opt[0]
                medias = [{"url": IMG_BASE + fn, "type": "image", "alt": fn}]
            try:
                payload = dict(
                    accountId=accid, description=main_text, scheduleAt=schedule_at,
                    title=f"Threads {label} {ds}", type_="image" if medias else "text",
                    medias=medias,
                    replies=[{"text": reply_text, "username": ""}],
                )
                res = client.create_schedule(accid, main_text, schedule_at,
                                             title=f"Threads {label} {ds}",
                                             type_="image" if medias else "text",
                                             medias=medias,
                                             replies=[{"text": reply_text, "username": ""}])
                sid = res.get("scheduleId") or res.get("id") or res.get("_id") or "?"
                ok += 1
                print(f"  ✅ {ds} {hour:02d}:00 WIB | {label:12s} | {sid}")
            except Exception as e:
                fail += 1
                print(f"  ❌ {ds} {hour:02d}:00 WIB | {label:12s} | {e}")

            # catat usage (hanya kalau berhasil — catat sebelum agar tidak dobel pakai walau sebagian gagal)
            st["used_links"].append(art[1])
            st["used_images"].append(img[0])
            st["used_quotes"].extend([q1[0][:40], q2[0][:40]])
            st["used_evening"].append(ev[0][:40])

        st["days_done"].append(ds)
        save_state(st)

    save_state(st)
    print(f"\n📊 Total: {ok} OK, {fail} gagal")

if __name__ == "__main__":
    main()
