#!/usr/bin/env python3
"""
LinkedIn StudioSoft — pasang SEMUA artikel studiosoft.id (FIXED 5 Sep 2026, Bos).
Gaya: bahas konten artikel dengan storytelling ringan + ajak ngobrol/diskusi.
TEXT only (JANGAN generate image). Slot kosong 05-23 WIB. Anti-redundant.
"""
import sys, json, urllib.request, hashlib, re
from datetime import datetime, timedelta, timezone

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

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

# hook pembuka storytelling per topik (varian biar nggak monoton)
def opener(judul, url):
    tl = judul.lower()
    if "ai" in tl or "overview" in tl:
        hook = "Banyak yang masih menganggap AI cuma tren — padahal ini sudah mengubah cara orang mencari dan memutuskan. Artikel StudioSoft kali ini membedahnya dengan bahasa yang mudah dipahami."
    elif "seo" in tl:
        hook = "SEO sering dianggap rumit, tapi sebenarnya ada pola sederhana di baliknya. Saya sempat baca artikel StudioSoft yang merangkumnya dengan sangat praktis — ini poin yang jarang dibahas."
    elif "website" in tl or "web" in tl:
        hook = "Website itu seperti etalase yang buka 24 jam — kalau tidak dirawat, orang yang datang justru kapok. Artikel StudioSoft ini menjelaskan apa yang sering dilupakan pemilik bisnis."
    elif "social media" in tl or "medsos" in tl or "konten" in tl:
        hook = "Konten itu bukan sekadar sering upload — tapi konsisten memberi nilai. Ada artikel menarik dari StudioSoft yang membedah strateginya, dan saya setuju dengan banyak poin di sana."
    elif "rumah sakit" in tl or "klinik" in tl or "kesehatan" in tl:
        hook = "Dunia kesehatan sekarang bersaing di Google juga. Artikel StudioSoft ini membahas bagaimana RS & klinik bisa hadir digital tanpa kehilangan sisi humanisnya."
    elif "umkm" in tl or "bisnis kecil" in tl:
        hook = "UMKM sering merasa digital marketing itu mahal. Padahal kalau tahu caranya, mulai dari hal kecil bisa berdampak besar. Ini yang dibahas di artikel StudioSoft."
    else:
        hook = "Baru baca artikel menarik dari StudioSoft — dan rasanya sayang kalau tidak dibahas bersama. Ada beberapa poin yang bikin saya mikir ulang soal strategi digital."
    return hook

def caption(judul, url, isi_bahas):
    return (
        f"{isi_bahas}\n\n"
        f"Judulnya: {judul}\n"
        f"Baca selengkapnya di sini 👇\n{url}\n\n"
        f"Menurut Anda, bagian mana yang paling relate dengan kondisi bisnis saat ini? "
        f"Cerita atau pendapat Anda sangat berharga — yuk diskusi di kolom komentar! 👇\n\n"
        f"#StudioSoft #DigitalMarketing #SEO #BisnisSurabaya #UMKM #BelajarDigital"
    )

def isi_bahas_template(judul, url):
    # storytelling ringan: ngajak ngobrol soal isi artikel
    tl = judul.lower()
    if "ai" in tl:
        return ("Saya termasuk yang dulu skeptis sama AI — sampai akhirnya melihat sendiri bagaimana AI bisa "
                "mempercepat riset dan konten. Artikel ini membahas hal itu dengan jujur: peluangnya, batasnya, "
                "dan cara memanfaatkannya untuk bisnis.\n\n"
                "Poin favorit saya: AI bukan pengganti manusia, tapi asisten yang membuat kita lebih fokus ke strategi.")
    if "seo" in tl:
        return ("Saya sering ditanya: 'SEO masih relevan nggak di zaman sekarang?' Jawabannya ada di artikel ini. "
                "Yang menarik, banyak orang salah paham — mengira SEO cuma soal kata kunci, padahal fondasinya jauh lebih dalam.\n\n"
                "Artikel ini mengupasnya dengan contoh praktis, bukan teori yang bikin pusing.")
    if "website" in tl:
        return ("Dulu ada klien yang bertanya: 'Website itu buat apa kalau saya sudah punya IG?' Pertanyaan bagus — "
                "dan jawabannya justru membuat saya semakin yakin: website itu aset, IG itu pinjaman algoritma.\n\n"
                "Artikel ini menjelaskan kenapa website tetap penting di 2026, lengkap dengan alasan yang masuk akal.")
    if "rumah sakit" in tl or "klinik" in tl:
        return ("Satu hal yang sering terlewat: pasien sekarang mencari dokter dan klinik lewat Google dulu, sebelum datang. "
                "Artikel ini membahas bagaimana RS & klinik bisa dioptimasi secara etis dan humanis.\n\n"
                "Buat yang bergerak di bidang kesehatan, ini wajib dibaca.")
    if "umkm" in tl:
        return ("Cerita UMKM yang naik kelas karena go-digital selalu menginspirasi. Artikel ini bukan cuma teori — "
                "ada langkah konkret yang bisa dicoba mulai minggu ini.\n\n"
                "Kuncinya: mulai dari yang kecil, ukur hasilnya, lalu perbaiki terus.")
    if "social media" in tl or "konten" in tl:
        return ("Konsistensi konten itu ibarat menanam pohon — tidak terlihat hari ini, tapi rindang nanti. "
                "Artikel ini membahas strategi media sosial yang realistis, bukan yang lebay.\n\n"
                "Ada satu kalimat di sana yang sampai sekarang masih saya ingat.")
    return ("Setiap artikel punya cerita di baliknya — dan yang satu ini membahas hal yang sering dianggap sepele "
            "padahal berdampak besar. Saya coba rangkum poin pentingnya biar mudah dicerna.\n\n"
            "Baca sampai habis, lalu kasih tahu pendapat Anda di kolom komentar.")

def get_pending():
    pend = []
    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") == SS_LI and (d.get("status") or "").lower() == "pending":
                pend.append(d)
    return pend

def main():
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 30
    belum = json.load(open("/tmp/ss_unshared_li.json"))
    st = json.load(open(STATE)) if __import__("os").path.exists(STATE) else {"posted": []}
    used_state = {p["url"] for p in st.get("posted", [])}
    belum = [(t, l) for t, l in belum if l not in used_state]
    print(f"📰 artikel belum dipakai & belum di-state: {len(belum)} — jadwalkan {min(n, len(belum))}")

    pend = get_pending()
    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
    for i, (judul, url) in enumerate(belum[:n]):
        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")

        pembuka = opener(judul, url)
        isi = isi_bahas_template(judul, url)
        cap = (f"{pembuka}\n\n{isi}\n\n"
               f"📄 {judul}\n{url}\n\n"
               f"Menurut Anda, bagian mana yang paling relate dengan kondisi bisnis Anda saat ini? "
               f"Yuk diskusi di kolom komentar! 👇\n\n"
               f"#StudioSoft #DigitalMarketing #SEO #BisnisSurabaya #UMKM")
        payload = {
            "accountId": SS_LI,
            "title": f"StudioSoft — {judul[:45]}",
            "description": cap,
            "topic": "Artikel StudioSoft",
            "type": "text",
            "medias": [],
            "scheduleAt": at,
            # FIX 5 Sep 2026: LinkedIn TIDAK support replies — WAJIB [].
            # (error post-time "Cannot read properties of undefined (reading 'postId')").
            "replies": [],
        }
        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
            print(f"  ✅ {slot.strftime('%d/%m %H:00')} WIB | {judul[:55]}")
            st["posted"].append({"date": slot.strftime("%Y-%m-%d"), "judul": judul, "url": url})
            with open(STATE, "w") as f:
                json.dump(st, f, indent=1, ensure_ascii=False)
        except Exception as e:
            fail += 1
            print(f"  ❌ {judul[:40]}: {e}")
    print(f"\n📊 Total: {ok} OK, {fail} gagal")

if __name__ == "__main__":
    main()
