#!/usr/bin/env python3
"""
Threads Cron — dipanggil langsung, tanpa agentTurn.
Posting konten unik ke StudioSoft & Uky Threads via Repliz API.

Aturan Bos:
- Max 500 karakter per post
- Bahasa Indonesia, gak pakai kata "gue", pakai "saya"
- Konten unik, jangan duplikasi
- Untuk @StudioSoft: tema digital marketing, website, SEO, tips bisnis online
- Untuk @ukyhandoko: tema entrepreneurship, agency life, founder journey, bisnis digital
"""
import json, urllib.request, os, random
from datetime import datetime, timezone, timedelta

from repliz_client import AUTH, HEADERS, BASE

LOG_FILE = '/home/mantapman/.hermes/profiles/atun/workspace/threads_log.txt'

WIB = timezone(timedelta(hours=7))

# === BANK KONTEN ===
# 12 konten StudioSoft, 12 konten Uky — random pick biar gak duplikasi
CONTENT_POOL = {
    "studiosoft": [
        # 1
        "Banyak orang kira website itu cuma \"yang penting jadi.\" Padahal bounce rate 80% itu bukan hal biasa — itu darurat.\n\n3 hal yang bikin pengunjung kabur:\n• Loading lelet — lebih dari 3 detik, bye\n• Desain norak — first impression jelek\n• Gak jelas CTA-nya — bingung mau klik mana\n\nWebsite itu etalase digital. Kalo etalasenya berantakan, ya pembeli pergi. #WebDesign #StudioSoft",
        # 2
        "SEO itu investasi jangka panjang. Bukan trik instan.\n\nBanyak bisnis mikir: \"Ah, nanti juga muncul sendiri.\" Padahal Google itu butuh sinyal:\n✅ Konten berkualitas & relevan\n✅ Kecepatan website oke\n✅ Mobile friendly\n✅ Backlink alami\n✅ User experience bagus\n\nSemakin cepat mulai, semakin cepat panen. #SEO #DigitalMarketing",
        # 3  
        "5 tools digital marketing gratis yang wajib kamu coba:\n\n1️⃣ Google Search Console — pantau performa website di Google\n2️⃣ Google Analytics — tau siapa pengunjung dan darimana datangnya\n3️⃣ Canva — bikin desain visual tanpa skill desain\n4️⃣ Ubersuggest — riset kata kunci SEO\n5️⃣ Google My Business — biar bisnis muncul di Google Maps\n\nGratisan tapi power-nya gila-gilaan. Mana yang udah kamu pake? #DigitalMarketing #Tools",
        # 4
        "Landing page yang bikin konversi naik 3x lipat itu rahasianya cuma 1 hal:\n\nFokus. Satu tujuan. Satu CTA.\n\nBukan 5 menu navigasi.\nBukan 10 pilihan produk.\nBukan artikel panjang lebar.\n\nSatu kalimat jelas: \"Daftar Sekarang,\" \"Beli di Sini,\" \"Konsultasi Gratis.\"\n\nItu aja. Sisanya distraksi. #LandingPage #Konversi",
        # 5
        "Gambar di website loading-ya lambat? Tenang, ini solusinya:\n\n1️⃣ Kompres pakai TinyPNG atau Squoosh — kecilin ukuran 70% tanpa turun kualitas\n2️⃣ Pake format WebP — 30% lebih kecil dari JPG/PNG\n3️⃣ Aktifin lazy loading — gambar cuma dimuat pas dilihat\n4️⃣ Ukuran maksimal 100-200KB per gambar\n\nHasil? Loading cepet, SEO happy, pengunjung betah. #WebPerformance #TipsWebsite",
        # 6
        "Bingung milih jasa bikin website? Ini yang harus diperhatiin:\n\n🔍 Cek portofolio — pernah bikin website yang mirip kebutuhan kamu?\n💰 Tanya harga detail — hosting, domain, maintenance, revisi, jangan ada biaya diam-diam\n🛠️ Tanya tech stack — pake CMS apa? Bisa diurus sendiri gak?\n📞 Support — kalo error tengah malem, ada yang bisa dihubungi?\n\nJangan pilih yang paling murah. Pilih yang paling cocok. #WebDev #BisnisOnline",
        # 7
        "Google Analytics 4 udah jadi standar baru. Yang belum migrasi dari Universal Analytics, udah ketinggalan.\n\nKenapa penting?\n• Tracking lebih akurat (event-based, bukan session-based)\n• Bisa lacak user lintas device\n• Fitur prediksi dengan machine learning\n• Integrasi lebih baik sama Google Ads\n\nMasih pake UA? Saatnya upgrade. Data adalah aset berharga. #GoogleAnalytics #Data",
        # 8
        "Tips aman biar website WordPress gak gampang kena hack:\n\n🔐 Update rutin — WordPress, theme, plugin jangan pernah skip update\n🔐 Plugin security — Wordfence atau Sucuri wajib terinstall\n🔐 Ganti login URL — jangan pake /wp-admin default\n🔐 2FA — aktifin two-factor authentication\n🔐 Backup — otomatis tiap minggu, simpan di cloud\n\nMencegah lebih murah daripada memperbaiki. #WordPress #KeamananWebsite",
        # 9
        "Copywriting itu beda sama nulis biasa.\n\nNulis biasa: \"Kami menjual sepatu berkualitas.\"\nCopywriting: \"Rasakan kenyamanan sepatu yang bikin kamu jalan lebih jauh tanpa capek.\"\n\nBedanya di EMPATHY. Pahami apa yang dirasakan pelanggan, bukan apa yang kamu jual.\n\nHeadline, CTA, value proposition — semua harus beresonansi. #Copywriting #Marketing",
        # 10
        "Banyak bisnis kecil ngerasa \"ah, branding mah buat perusahaan gede.\"\n\nPadahal branding itu sesimpel:\n• Logo yang konsisten\n• Warna yang sama di semua media\n• Tone of voice yang dikenali\n• Pelayanan yang diingat\n\nBranding adalah janji. Janji kamu ke pelanggan tentang apa yang bisa mereka harapkan.\n\nMulai dari hal kecil. Konsisten. #Branding #BisnisPemula",
        # 11
        "Tau gak sih, 75% orang judge kredibilitas website dari desainnya?\n\nBeneran. Data dari Stanford Web Credibility Research.\n\nArtinya:\n✅ Warna dan font profesional — langsung dipercaya\n❌ Layout berantakan — dicap abal-abal\n\nInvestasi di desain website itu investasi di kepercayaan pelanggan. Bukan sekadar cantik. #WebDesign #Kredibilitas",
        # 12
        "3 metrik yang beneran penting di website kamu:\n\n🎯 Conversion Rate — berapa persen pengunjung yang jadi pelanggan\n🎯 Bounce Rate — berapa yang langsung pergi tanpa liat halaman lain\n🎯 Average Session Duration — berapa lama mereka betah di website\n\nBanyak yang sibuk liat pageview doang. Padahal 3 metrik di atas yang nentuin apakah website kamu beneran bekerja atau cuma pajangan. #WebsiteAnalytics #DigitalBisnis",
    ],
    "uky": [
        # 1
        "5 tahun jalanin agency, saya baru sadar: skill teknis cuma 20% dari kesuksesan. Sisanya? People skill.\n\nCara ngomong ke klien, cara negosiasi, cara manage ekspektasi — itu yang bikin klien balik lagi. Bukan seberapa keren kode yang kamu tulis.\n\nInvestasi terbesar?: belajar baca orang. Bukan belajar bahasa pemrograman baru. #AgencyLife #Entrepreneur",
        # 2
        "Saya sering dibilang kerja terlalu keras. Saya jawab: \"Saya kerja cerdas, tapi kadang saya emang harus kerja keras juga.\"\n\nBedanya:\n• Kerja keras tanpa arah = buang energi\n• Kerja cerdas tanpa eksekusi = cuma mimpi\n\nYang paling ideal: kombinasi. Pake otak buat strategi, pake tangan buat eksekusi. Jangan milih salah satu. #Productivity #Mindset",
        # 3
        "Kesalahan terbesar founder baru: mikir semua harus perfect sebelum launching.\n\nRealitanya:\n• Perfect itu musuh dari done\n• Customer feedback > imajinasi sendiri\n• Version 1.0 pasti jelek, yang penting learning\n\nLaunch dulu. Evaluasi. Iterasi. Improvement terus.\n\nJangan nunggu sempurna karena gak akan pernah tiba. #StartupMindset #Founder",
        # 4
        "Klien saya pernah bilang: \"Saya pilih kamu karena kamu jujur, bukan karena kamu murah.\"\n\nItu momen yang bikin saya sadar — di bisnis kreatif, integritas itu mahal harganya. Banyak yang rela bilang \"bisa\" padahal gak bisa, asal dapet project.\n\nSaya milih jalan sebaliknya. Lebih susah di awal, tapi lebih tenang dijalanin. #BisnisKreatif #Integritas",
        # 5
        "Nasehat buat anak muda yang mau mulai bisnis:\n\n1️⃣ Selesaikan 1 project dulu sebelum ambil yang ke-2\n2️⃣ Jangan takut gagal, takutlah sama gak mulai-mulai\n3️⃣ Network is everything — jaga hubungan baik\n4️⃣ Harga diri jangan dijual murah\n5️⃣ Baca kontrak sampe titik koma terakhir\n\nNo 5 ini penting banget. Percaya sama yang udah jalan 🫡 #BisnisPemula #TipsBisnis",
        # 6
        "Dulu saya mikir punya banyak klien itu sukses. Sekarang saya mikir: punya klien yang tepat itu sukses.\n\nKlien yang tepat:\n• Bayar tepat waktu\n• Respect proses kreatif\n• Gak ngatur-ngatur teknis\n• Feedback-nya membangun\n\nPernah ngalamin klien yang bikin stress? Itu tanda kamu perlu lebih selektif. #AgencyLife #Klien",
        # 7
        "Kunci supaya tim bisa kerja tanpa lo:\n\n📋 SOP — semuanya dicatat. Cara A sampai Z.\n📞 Komunikasi — grup chat, meeting rutin, standup harian\n🎯 Visi jelas — tau kemana arahnya\n🤝 Trust — percayain mereka, jangan over-manage\n\nBisnis yang bisa jalan tanpa founder itu bisnis sejati. Kalo lo cuti 2 minggu trus berantakan? Masih banyak PR. #Leadership #BusinessSystem",
        # 8
        "Satu pelajaran bisnis yang tidak diajarin di kampus:\n\nCash flow itu raja.\n\nBukan revenue. Bukan omzet. Bukan follower count atau brand awareness.\n\nCash flow.\n\nUang masuk dan keluar. Kalo arusnya macet, bisnis sekelas apapun bisa tumbang. Pantau arus kas tiap minggu. Gak cuma tiap bulan. #Bisnis101 #CashFlow",
        # 9
        "Saya makin percaya: kualitas hidup itu ditentukan oleh siapa yang ada di sekitar kita.\n\nTim yang solid. Mitra yang sepaham. Klien yang saling respect. Keluarga yang supportif.\n\nOrang yang salah di posisi strategis bisa hancurin budaya kerja. Sebaliknya, orang yang tepat bisa angkat tim jadi level berikutnya.\n\nHire slow. Fire fast. #PeopleFirst #Leadership",
        # 10
        "Banyak yang nanya: \"Gimana caranya multitasking biar produktif?\"\n\nJawaban saya: jangan multitasking. Itu mitos. Otak manusia gak dirancang buat fokus ke 2 hal sekaligus.\n\nYang kita lakuin itu sebenarnya task-switching — loncat-loncat antar tugas. Dan itu bikin: lebih lambat, lebih banyak salah, energi terkuras.\n\nCoba deep work. 1 tugas, fokus penuh, gak ada notifikasi. Hasilnya beda banget. #Produktivitas #DeepWork",
        # 11
        "Kesalahan yang sering saya liat di awal usaha:\n\nBikin semuanya gratisan dulu biar dapet portofolio.Trus susah naikin harga.\n\nPadahal:\n• Harga rendah = ekspektasi rendah = klien gak respect\n• Harga wajar = komitmen dua arah = hasil lebih serius\n\nBikin portofolio gapapa. Tapi jangan biasain gratis. Kasih harga simbolis aja udah beda treatmennya. #Pricing #BisnisKreatif",
        # 12
        "Salah satu hal paling underrated di bisnis: istirahat.\n\nBanyak founder bangga bisa begadang dan kerja 16 jam sehari. Padahal itu tanda sistemnya bermasalah. Bukan tanda dia hebat.\n\nOtak yang capek: kreativitas turun, decision making jelek, dan risiko burnout tinggi.\n\nPrioritasin tidur. Badan sehat, bisnis ikut sehat. Simple. #SelfCare #FounderMentalHealth",
    ]
}

def post_thread(account_id, text):
    """Post langsung via Repliz, jadwalkan +2 menit dari sekarang"""
    now = datetime.now(WIB) + timedelta(minutes=2)
    iso = now.strftime("%Y-%m-%dT%H:%M:00+07:00")
    
    payload = {
        "title": "",
        "description": text[:500],
        "topic": "",
        "type": "text",
        "medias": [],
        "meta": {"title": "", "description": "", "url": ""},
        "additionalInfo": {
            "isAiGenerated": False, "isDraft": False,
            "collaborators": [], "mentions": [],
            "music": {"id": "", "artist": "", "name": "", "thumbnail": ""},
            "products": [], "tags": []
        },
        "replies": [],
        "accountId": account_id,
        "scheduleAt": iso,
    }
    
    body = json.dumps(payload).encode()
    req = urllib.request.Request(f"{BASE}/public/schedule", data=body, headers=HEADERS, method="POST")
    with urllib.request.urlopen(req) as r:
        result = json.loads(r.read())
        return result.get("scheduleId", result.get("_id", "?"))

def get_posted_contents():
    """Baca log untuk cek konten yang udah pernah dipost"""
    if not os.path.exists(LOG_FILE):
        return []
    with open(LOG_FILE, 'r') as f:
        content = f.read()
    return content

def main():
    posted = get_posted_contents()
    now_str = datetime.now(WIB).strftime("%Y-%m-%d %H:%M WIB")
    
    results = []
    
    for key, name, aid in [
        ("studiosoft", "StudioSoft", "6a335b9ec5ff4ce3a3225c2a"),
        ("uky", "Uky", "6a334e89c5ff4ce3a3225a48"),
    ]:
        pool = CONTENT_POOL[key]
        # Pilih konton random yang belum pernah dipost
        random.shuffle(pool)
        chosen = None
        for text in pool:
            # Cek apakah text ini udah pernah dipost (cek 100 chars pertama)
            sample = text[:80]
            if sample not in posted:
                chosen = text
                break
        
        if not chosen:
            chosen = pool[0]  # fallback kalo semua udah pernah
        
        try:
            sid = post_thread(aid, chosen)
            results.append(f"✅ {name} → {sid}")
            print(f"[{now_str}] ✅ {name} posted → {sid}")
            
            # Log
            with open(LOG_FILE, 'a') as f:
                f.write(f"\n--- {datetime.utcnow().strftime('%Y-%m-%d %H:%M UTC')} ---\n")
                f.write(f"{name} | {aid} | ID: {sid}\n")
                f.write(f"{chosen[:100]}...\n")
        except Exception as e:
            results.append(f"❌ {name} → {str(e)[:60]}")
            print(f"[{now_str}] ❌ {name} gagal: {e}")
    
    return "\n".join(results)

if __name__ == "__main__":
    result = main()
    print(result)

