#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Threads @ukyhandoko — storytelling framework 5 babak (FIXED 5 Sep 2026, Bos):
1. KONTEKS   — latar/awal cerita
2. KARAKTER  — tokoh & karakternya
3. KONFLIK   — masalah/tantangan
4. KLIMAKS   — titik puncak / perubahan
5. KESIMPULAN— pelajaran & pancingan diskusi
Isi slot KOSONG saja. Tanpa mention internal.
"""
import sys, json, urllib.request
sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import HEADERS, BASE

WIB = timezone = __import__("datetime").timezone
from datetime import datetime, timedelta

WIB = timezone(timedelta(hours=7))
UKY_T = "6a334e89c5ff4ce3a3225a48"
SLOTS = [5, 8, 11, 14, 17, 20, 23]
STATE = "/home/mantapman/.hermes/profiles/atun/workspace/threads_uky_story_state.json"

# ── Bank cerita framework 5 babak ──
STORIES = [
    {
        "judul": "Website pertama, dari kamar kos",
        "konteks": "Dulu saya kerja dari kamar kos 3x3 di Surabaya. Meja lipat, laptop seadanya, kipas angin yang kadang berisik. Itulah 'kantor' pertama saya.",
        "karakter": "Saya waktu itu anak muda yang baru belajar bikin website otodidak. Percaya diri tinggi, tapi modal minim dan pengalaman masih nol.",
        "konflik": "Klien pertama datang: pemilik toko sembako yang butuh website. Masalahnya, saya belum pernah garap proyek sungguhan. Rasa takut gagal dan takut mengecewakan bercampur jadi satu.",
        "klimaks": "Malam sebelum deadline, website-nya error dan saya belum nemu solusinya. Jam 2 pagi, saya hampir menyerah. Tapi saya ingat ucapan klien: 'yang penting niatnya bagus, saya percaya.' Saya tarik napas, bongkar ulang, dan akhirnya ketemu — website jalan sempurna.",
        "kesimpulan": "Sejak itu saya paham: kepercayaan itu bukan dari hasil sempurna, tapi dari niat jujur dan kemauan belajar. Website itu bukan cuma kode — ia jembatan kepercayaan antara kita dan orang lain.\n\nPunya momen 'hampir menyerah' tapi akhirnya berhasil? Cerita di komentar ya! 👇",
    },
    {
        "judul": "SEO yang gagal 6 bulan",
        "konteks": "Tahun-tahun awal, saya menggarap website klien dan janji hasil 3 bulan. Realitanya? 6 bulan berlalu, website masih di halaman 5 Google.",
        "karakter": "Saya dan klien — dua orang yang sama-sama berharap, tapi mulai ragu. Klien mulai tanya-tanya, saya mulai gelisah.",
        "konflik": "Masalahnya bukan cuma peringkat. Saya sadar saya salah strategi dari awal: mengejar keyword yang terlalu kompetitif, konten asal tulis, dan mengabaikan teknis SEO sepenuhnya.",
        "klimaks": "Di titik terendah, klien memberi kesempatan terakhir: 'Saya kasih 3 bulan lagi.' Saya putuskan jujur — minta waktu riset ulang, ganti keyword realistis, tulis konten yang benar-benar menjawab kebutuhan orang, dan benahi teknis. Bulan ketiga, website masuk halaman 1 untuk 12 kata kunci.",
        "kesimpulan": "Kegagalan 6 bulan itu bukan akhir — justru jadi kurikulum paling berharga dalam karier saya. Gagal itu bukan musuh; ia guru yang mengajari apa yang tidak diajarkan kursus.\n\nPernah gagal panjang lalu jadi titik balik? Cerita di komentar! 👇",
    },
    {
        "judul": "3 jam perjalanan demi satu klien",
        "konteks": "Suatu sore, saya dapat chat dari pemilik toko offline di kota sebelah. Ia ingin jualan online, tapi bingung mulai dari mana — dan minta bertemu langsung.",
        "karakter": "Beliau, pemilik toko yang bangga dengan produknya tapi buta teknologi. Saya, yang waktu itu sibuk dan bisa saja menolak karena jauh.",
        "konflik": "Perjalanan 3 jam sekali jalan. Di tengah jalan saya sempat ragu: apakah ini sepadan? Bukankah bisa video call saja?",
        "klimaks": "Sesampainya di sana, beliau menunjukkan tokonya dengan mata berbinar. Kami ngobrol lama — bukan soal website, tapi soal pelanggan, harapan, dan ketakutannya mulai online. Saat itu saya sadar: yang beliau butuhkan bukan jasa, tapi seseorang yang mau mendengar dulu.",
        "kesimpulan": "Hari itu saya belajar: kunci bisnis bukan strategi paling canggih, tapi keberadaan kita saat orang benar-benar butuh. Jarak 3 jam terasa kecil kalau itu membangun kepercayaan seumur hidup.\n\nPernah jauh-jauh demi sesuatu yang ternyata berharga? Cerita di komentar! 👇",
    },
    {
        "judul": "Uang pertama dari internet",
        "konteks": "Bertahun-tahun lalu, malam biasa di kamar kos. Saya baru saja menyelesaikan jasa kecil — website sederhana untuk toko online tetangga.",
        "karakter": "Saya, pemuda yang belajar bikin website dari tutorial gratis. Bukan siapa-siapa, tanpa portofolio, tanpa ijazah coding.",
        "konflik": "Saya takut nominalnya terlalu kecil untuk disebut 'penghasilan'. Apakah ini bisa dianggap serius? Apa kata orang kalau tahu saya kerja 'dari internet'?",
        "klimaks": "Malam itu saya cek rekening berkali-kali. Ada transfer masuk — dari orang yang membayar sesuatu yang saya kerjakan dari kamar. Rasanya beda: bukan soal nominalnya, tapi soal diakui.",
        "kesimpulan": "Dari situlah keyakinan lahir: internet membuka pintu yang tadinya tertutup. Siapa pun bisa mulai — asal mau belajar dan konsisten.\n\nKamu ingat penghasilan pertama dari internet? Cerita yuk! 👇",
    },
    {
        "judul": "Review yang mengubah segalanya",
        "konteks": "Website klien kami sepi pengunjung. Sudah coba konten, iklan kecil-kecilan — hasilnya tetap minim.",
        "karakter": "Klien kami, pemilik usaha kecil yang jujur dan ramah. Pelanggannya, orang biasa yang puas dengan pelayanan. Dan kami, tim yang mulai putus asa.",
        "konflik": "Kami bingung: produk bagus, harga masuk akal, tapi orang tidak percaya. Ternyata masalahnya bukan produk — tapi reputasi yang belum terbangun.",
        "klimaks": "Suatu hari, seorang pelanggan menulis review panjang dan tulus. Bukan dibuat-buat. Beberapa minggu kemudian, review itu muncul di pencarian Google — dan orang mulai percaya, karena yang merekomendasikan bukan kami, tapi pelanggan puas.",
        "kesimpulan": "Sejak itu saya paham: kepercayaan paling kuat datang dari pihak ketiga, bukan dari kita sendiri. Rawat reputasi online — itu aset yang tidak terlihat, tapi menentukan.\n\nPernah beli sesuatu karena baca review orang? Cerita di komentar! 👇",
    },
    {
        "judul": "Pelanggan yang batal, lalu balik lagi",
        "konteks": "Beberapa tahun lalu, ada calon klien yang batal kerja sama di menit-menit terakhir. Saya sudah habiskan waktu diskusi dan menyusun proposal.",
        "karakter": "Beliau, pebisnis yang ragu-ragu dan akhirnya memilih vendor lain. Saya, yang kecewa tapi memilih tetap profesional.",
        "konflik": "Godaan terbesar waktu itu: membalas dengan dingin atau memutus kontak. Tapi saya pilih jalan lain — tetap menjaga komunikasi, sesekali kirim konten bermanfaat, tanpa memaksa.",
        "klimaks": "Enam bulan kemudian, beliau chat lagi: 'Bang, kemarin saya pilih yang lain, ternyata hasilnya tidak sesuai. Masih bisa kerja sama?' Kami bekerja sama sampai sekarang.",
        "kesimpulan": "Pelajarannya: orang boleh menunda, tapi kalau kita tetap bermanfaat dan profesional, mereka akan ingat. Jualan itu maraton, bukan sprint.\n\nPernah ngalamin pelanggan balik lagi setelah lama? Cerita di komentar! 👇",
    },
    {
        "judul": "Orang tua yang tidak paham kerja online",
        "konteks": "Di awal karier, orang tua saya sering bingung melihat saya di depan laptop berjam-jam.",
        "karakter": "Ibu dan Bapak — generasi yang terbiasa kerja dari pagi sampai sore di tempat yang jelas. Saya, anak mereka yang 'kerjanya main komputer'.",
        "konflik": "Setiap ditanya 'kerja apa?', saya kesulitan menjelaskan. 'Bikin website' terdengar asing. Saya ingin mereka bangga, tapi belum ada bukti yang bisa mereka pegang.",
        "klimaks": "Suatu hari, tetangga datang dan bilang ke ibu saya: 'Anaknya hebat ya, bikin toko online tetangga jadi laku.' Wajah ibu saya bersinar. Sejak itu, mereka tidak pernah ragu lagi.",
        "kesimpulan": "Kadang yang kita butuh bukan penjelasan panjang, tapi satu momen di mana usaha kita diakui orang lain. Teruslah bekerja — hasilnya yang akan bicara.\n\nPunya pengalaman kerja yang tidak dipahami keluarga? Cerita di komentar! 👇",
    },
    {
        "judul": "Membangun dari nol itu menakutkan",
        "konteks": "Sebelum punya tim, saya mengerjakan semuanya sendiri: desain, konten, pemasaran, bahkan bales chat klien.",
        "karakter": "Saya — satu orang yang harus jadi banyak peran, dengan modal yang pas-pasan dan banyak yang belum tahu.",
        "konflik": "Ada malam-malam di mana saya bertanya: 'Ini jalan yang benar nggak sih?' Ketika proyek gagal atau klien kecewa, rasanya seluruh dunia runtuh. Tidak ada yang bisa diajak berbagi beban.",
        "klimaks": "Perlahan saya sadar: tidak apa-apa tidak tahu segalanya. Yang penting tahu ke mana harus bertanya dan berani meminta bantuan. Dari situlah saya mulai membangun tim — orang-orang yang melengkapi kekurangan saya.",
        "kesimpulan": "Membangun dari nol itu menakutkan, tapi justru di situlah pertumbuhan terjadi. Tidak perlu sempurna — cukup mulai dan terus belajar.\n\nApa bagian tersulit dari perjalananmu sejauh ini? Cerita di komentar! 👇",
    },
]

def compose(story):
    return (
        f"📖 {story['judul']}\n\n"
        f"• Konteks: {story['konteks']}\n\n"
        f"• Karakter: {story['karakter']}\n\n"
        f"• Konflik: {story['konflik']}\n\n"
        f"• Klimaks: {story['klimaks']}\n\n"
        f"• Kesimpulan: {story['kesimpulan']}\n\n"
        f"#Storytelling #BisnisDigital #UMKM #PengalamanBisnis"
    )

def load_state():
    try:
        with open(STATE) as f:
            return json.load(f)
    except Exception:
        return {"used": []}

def main():
    n = int(sys.argv[1]) if len(sys.argv) > 1 else len(STORIES)
    st = load_state()
    used = set(st.get("used", []))

    pend = []
    for p in range(1, 60):
        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") == UKY_T and (d.get("status") or "").lower() == "pending":
                pend.append(d)
    taken = {(d.get("scheduleAt") or "")[:13] for d in pend}

    now = datetime.now(WIB)
    day = now.replace(minute=0, second=0, microsecond=0)
    ok = fail = 0
    posted = 0
    for story in STORIES:
        if story["judul"] in used:
            continue
        if posted >= n:
            break
        slot = None
        for _ in range(30):
            for h in SLOTS:
                cand = day.replace(hour=h)
                if cand <= now:
                    continue
                utc_h = cand.astimezone(timezone.utc).strftime("%Y-%m-%dT%H")
                if utc_h not in taken:
                    slot = cand
                    break
            if slot:
                break
            day += timedelta(days=1)
        if slot is None:
            print("⚠️ slot habis")
            break
        taken.add(slot.astimezone(timezone.utc).strftime("%Y-%m-%dT%H"))
        at = slot.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")
        cap = compose(story)
        payload = {
            "accountId": UKY_T,
            "title": f"Cerita: {story['judul']}",
            "description": cap,
            "topic": "Storytelling",
            "type": "text",
            "medias": [],
            "scheduleAt": at,
            "replies": [{"text": "Setiap cerita pasti ada pelajaran. Semoga menginspirasi! 💪", "username": ""}],
        }
        req = urllib.request.Request(f"{BASE}/public/schedule",
                                     data=json.dumps(payload).encode(),
                                     headers={**HEADERS, "Content-Type": "application/json"})
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                res = json.load(r)
            ok += 1
            posted += 1
            print(f"  ✅ {slot.strftime('%d/%m %H:00')} WIB | {story['judul']}")
            st["used"].append(story["judul"])
            with open(STATE, "w") as f:
                json.dump(st, f, indent=1, ensure_ascii=False)
        except Exception as e:
            fail += 1
            print(f"  ❌ {story['judul']}: {e}")
    print(f"\n📊 Total: {ok} OK, {fail} gagal")

if __name__ == "__main__":
    main()
