#!/usr/bin/env python3
"""
Daily Artikel StudioSoft Poster — Otomatis 1 artikel per hari ke FB, LinkedIn, Threads.
Dipanggil via cron tiap hari jam 08:00 WIB (01:00 UTC).
"""
import base64, json, os, sys, random
import urllib.request
from datetime import datetime, timezone, timedelta
from PIL import Image, ImageDraw, ImageFont

from repliz_client import upload_image_to_server, AUTH_HEADER
HEADERS = {'Authorization': AUTH_HEADER, 'Content-Type': 'application/json'}
BASE = 'https://api.repliz.com'

# === Konfigurasi Thumbnail ===
THUMB_DIR = "/home/mantapman/.hermes/profiles/atun/workspace/artikel_thumbnails"
os.makedirs(THUMB_DIR, exist_ok=True)

FONT_DIR = os.path.expanduser("~/.fonts")

BLUE = (30, 64, 175)
WHITE = (255, 255, 255)
LIGHT_BLUE = (219, 234, 254)

THUMB_W, THUMB_H = 1200, 630

def thumb_font(name, size):
    return ImageFont.truetype(os.path.join(FONT_DIR, name), size)

TITLE48 = thumb_font("Poppins-Bold.ttf", 48)
TITLE36 = thumb_font("Poppins-Bold.ttf", 36)
REG24 = thumb_font("Poppins-Regular.ttf", 24)
BOLD20 = thumb_font("Poppins-Bold.ttf", 20)

def wrap_text(text, font, max_width):
    words = text.split()
    lines = []
    current = ""
    for w in words:
        test = current + (" " if current else "") + w
        bbox = font.getbbox(test)
        if bbox[2] - bbox[0] <= max_width:
            current = test
        else:
            if current:
                lines.append(current)
            current = w
    if current:
        lines.append(current)
    return lines

def generate_thumbnail(artikel_id, title, topic):
    """Generate thumbnail artikel dengan judul di tengah, BG biru StudioSoft"""
    img = Image.new("RGB", (THUMB_W, THUMB_H), BLUE)
    d = ImageDraw.Draw(img)
    
    d.text((60, 40), "STUDIOSOFT", font=BOLD20, fill=LIGHT_BLUE)
    d.text((60, 75), topic.upper(), font=BOLD20, fill=WHITE)
    d.rectangle([60, 120, 300, 124], fill=LIGHT_BLUE)
    
    max_w = THUMB_W - 120
    lines = wrap_text(title, TITLE48, max_w)
    if len(lines) > 3:
        lines = wrap_text(title, TITLE36, max_w)
    
    tf = TITLE48 if len(lines) <= 3 else TITLE36
    total_h = len(lines) * 65
    start_y = (THUMB_H - total_h) // 2 - 20
    
    for i, line in enumerate(lines):
        d.text((60, start_y + i * 65), line, font=tf, fill=WHITE)
    
    bottom_y = start_y + total_h + 30
    d.rectangle([60, bottom_y, min(400, THUMB_W - 60), bottom_y + 4], fill=WHITE)
    
    d.text((60, THUMB_H - 50), "studiosoft.id", font=REG24, fill=LIGHT_BLUE)
    d.text((THUMB_W - 60, THUMB_H - 50), "#Artikel", font=REG24, fill=LIGHT_BLUE, anchor="rt")
    
    fname = f"artikel_{artikel_id}.png"
    fpath = os.path.join(THUMB_DIR, fname)
    img.save(fpath)
    return fpath

# === CONFIG ===
WIB = timezone(timedelta(hours=7))

LOG_FILE = "/home/mantapman/.hermes/profiles/atun/workspace/artikel_studiosoft_log.txt"

ACCOUNTS = {
    "fb": "6a334952c5ff4ce3a3225941",       # FB StudioSoft
    "linkedin": "6a334c49c5ff4ce3a32259c9",  # LinkedIn StudioSoft
    "threads": "6a334e89c5ff4ce3a3225a48",   # Threads @ukyhandoko
}

# === DAFTAR ARTIKEL (urut dari terbaru) ===
ARTIKEL = [
    {
        "id": 1,
        "title": "7 Contoh Guerilla Marketing Paling Kreatif dari Indonesia dan Dunia",
        "url": "https://studiosoft.id/contoh-guerilla-marketing-kreatif-indonesia-dunia/",
        "topic": "Guerilla Marketing",
        "fb": (
            "Gak perlu budget gede buat bikin kampanye yang diingat orang. "
            "Guerilla marketing udah berkali-kali membuktikan: kreativitas lebih powerful daripada anggaran.\n\n"
            "Dari Coca-Cola yang bikin mesin minuman 'bayar pakai pelukan', IKEA dengan petunjuk arah "
            "satuan sofa, sampai Gojek yang modal stiker motor doang — semuanya viral tanpa iklan berbayar. "
            "Bahkan di Indonesia, plang-plang lucu warung Madura jadi bukti bahwa ide sederhana bisa "
            "menjadi konten organik yang dibagikan ribuan kali.\n\n"
            "Artikel lengkapnya di sini:\n{url}\n\n"
            "#GuerillaMarketing #DigitalMarketing #BrandingKreatif #StudioSoft #MarketingIndonesia"
        ),
        "linkedin": (
            "7 kampanye yang membuktikan kreativitas > budget.\n\n"
            "Guerilla marketing bukan soal berapa banyak uang yang dikeluarkan, tapi seberapa kreatif "
            "ide yang dijalankan. Coca-Cola, IKEA, KitKat, National Geographic — bahkan Gojek dan "
            "warung Madura — semuanya berhasil mencuri perhatian tanpa harus pasang iklan mahal.\n\n"
            "Yang menarik: hampir semua contoh ini mengandalkan elemen kejutan dan pengalaman langsung "
            "yang bikin orang secara sukarela membagikannya ke media sosial.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "7 contoh guerilla marketing yang bikin saya mikir ulang soal strategi promosi.\n\n"
            "Coca-Cola bikin mesin minuman 'bayar pakai pelukan'. IKEA pasang petunjuk arah "
            "pake satuan sofa. Gojek modal stiker motor doang.\n\n"
            "Semuanya viral tanpa iklan berbayar. Kreativitas > budget. Always.\n\n"
            "Baca artikel lengkapnya:\n{url}"
        ),
    },
    {
        "id": 2,
        "title": "5 Strategi Guerilla Marketing yang Bisa Dicoba UMKM Sekarang",
        "url": "https://studiosoft.id/strategi-guerilla-marketing-umkm/",
        "topic": "Guerilla Marketing UMKM",
        "fb": (
            "Guerilla marketing bukan cuma buat perusahaan besar dengan tim kreatif. "
            "UMKM juga bisa kok, dan justru di situlah letak kekuatannya.\n\n"
            "Ambient marketing, stunt marketing, flash mob — semua strategi ini bisa "
            "dijalankan dengan budget minim asal ada kreativitas. Yang penting berani "
            "berbeda dan paham karakter audiens.\n\n"
            "5 strategi lengkap di artikel ini:\n{url}\n\n"
            "#GuerillaMarketing #UMKM #DigitalMarketing #StudioSoft #StrategiMarketing"
        ),
        "linkedin": (
            "5 strategi guerilla marketing yang langsung bisa dicoba UMKM.\n\n"
            "Tidak semua bisnis punya budget besar untuk iklan TV atau billboard. "
            "Tapi itu bukan alasan untuk tidak bisa membuat dampak.\n\n"
            "Ambient marketing, ambient media, stunt marketing, flash mob, dan "
            "experiential marketing — semuanya bisa dijalankan dengan kreativitas "
            "dan pemahaman audiens yang tepat.\n\n"
            "Selengkapnya:\n{url}"
        ),
        "threads": (
            "5 strategi guerilla marketing yang cocok banget buat UMKM.\n\n"
            "Ambient marketing, stunt marketing, flash mob, experiential — "
            "semua bisa jalan dengan budget minim. Asal ada kreativitas.\n\n"
            "Gak perlu nunggu besar dulu buat mulai.\n\n"
            "Baca artikelnya:\n{url}"
        ),
    },
    {
        "id": 3,
        "title": "Apa Itu Guerilla Marketing? Strategi Iklan Kreatif Modal Kecil Dampak Besar",
        "url": "https://studiosoft.id/apa-itu-guerilla-marketing-strategi-iklan-kreatif-modal-kecil/",
        "topic": "Guerilla Marketing Dasar",
        "fb": (
            "Guerilla marketing: strategi iklan yang mengandalkan kreativitas, "
            "bukan budget. Pertama diperkenalkan Jay Conrad Levinson tahun 1984, "
            "dan sampai sekarang masih jadi senjata andalan brand besar dan kecil.\n\n"
            "Intinya sederhana: bikin orang berhenti, terkejut, lalu ngomongin brand "
            "kamu. Efek word-of-mouth-nya jauh lebih kuat dari iklan biasa.\n\n"
            "Pengertian lengkap, sejarah, dan tips mulai ada di sini:\n{url}\n\n"
            "#GuerillaMarketing #DigitalMarketing #Branding #StudioSoft #TipsBisnis"
        ),
        "linkedin": (
            "Apa sebenarnya guerilla marketing dan kenapa masih relevan di 2026?\n\n"
            "Konsep yang diperkenalkan Jay Conrad Levinson pada 1984 ini justru "
            "semakin relevan di era digital. Dengan informasi yang membanjiri konsumen "
            "setiap hari, cara konvensional seringkali tenggelam.\n\n"
            "Guerilla marketing menawarkan pendekatan berbeda: kejutan, interaksi, "
            "dan pengalaman yang bikin orang benar-benar memperhatikan.\n\n"
            "Baca artikel lengkapnya:\n{url}"
        ),
        "threads": (
            "Guerilla marketing diperkenalkan tahun 1984. Tapi justru sekarang "
            "semakin relevan di tengah banjir informasi digital.\n\n"
            "Kuncinya: kejutan, interaksi, pengalaman. Bikin orang berhenti "
            "scroll dan ngomongin brand kamu.\n\n"
            "Kreativitas > Budget. Selalu.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
    },
    {
        "id": 4,
        "title": "SEO untuk UMKM: Panduan Lengkap Mendapatkan Pelanggan Tanpa Budget Besar",
        "url": "https://studiosoft.id/seo-untuk-umkm/",
        "topic": "SEO UMKM",
        "fb": (
            "Udah bayar iklan Google sama Facebook tapi hasilnya gitu-gitu aja? "
            "Mungkin saatnya beralih ke SEO.\n\n"
            "SEO itu investasi jangka panjang yang hasilnya lebih awet daripada "
            "iklan berbayar. Dengan strategi yang tepat, website UMKM bisa "
            "muncul di halaman pertama Google tanpa perlu budget iklan tiap bulan.\n\n"
            "Panduan SEO lengkap khusus UMKM ada di artikel ini:\n{url}\n\n"
            "#SEO #UMKM #DigitalMarketing #StudioSoft #WebsiteBisnis"
        ),
        "linkedin": (
            "SEO untuk UMKM: strategi mendapatkan pelanggan tanpa budget besar.\n\n"
            "Banyak UMKM mengandalkan iklan berbayar sebagai satu-satunya sumber "
            "traffic. Padahal SEO bisa menjadi aset jangka panjang yang jauh lebih "
            "hemat biaya.\n\n"
            "Mulai dari riset keyword, optimasi on-page, hingga membangun backlink "
            "— semua bisa dilakukan secara bertahap tanpa harus menyewa agency mahal.\n\n"
            "Panduan lengkap:\n{url}"
        ),
        "threads": (
            "SEO itu investasi jangka panjang buat UMKM. Hasilnya lebih awet "
            "daripada iklan berbayar.\n\n"
            "Mulai dari riset keyword, optimasi on-page, sampe backlink — "
            "semua bisa jalan bertahap.\n\n"
            "Panduan lengkapnya:\n{url}"
        ),
    },
    {
        "id": 5,
        "title": "AI untuk Marketing Panduan UMKM Modern",
        "url": "https://studiosoft.id/ai-untuk-marketing/",
        "topic": "AI Marketing UMKM",
        "fb": (
            "AI bukan cuma buat perusahaan teknologi raksasa. UMKM juga "
            "bisa memanfaatkan kecerdasan buatan buat marketing.\n\n"
            "Dari bikin konten otomatis, analisis data pelanggan, sampai "
            "chatbot untuk layanan 24 jam — semua udah bisa diakses dengan "
            "biaya terjangkau. Yang penting tahu cara memulainya.\n\n"
            "Panduan AI untuk marketing UMKM:\n{url}\n\n"
            "#AI #ArtificialIntelligence #UMKM #DigitalMarketing #StudioSoft"
        ),
        "linkedin": (
            "AI untuk marketing bukan lagi masa depan — ini sudah terjadi sekarang.\n\n"
            "UMKM yang cepat beradaptasi dengan AI akan memiliki keunggulan "
            "kompetitif yang signifikan. Mulai dari content generation, "
            "analisis sentimen, hingga personalisasi campaign.\n\n"
            "Yang perlu diingat: AI adalah alat, bukan pengganti strategi. "
            "Manusia tetap yang menentukan arah.\n\n"
            "Panduan lengkap:\n{url}"
        ),
        "threads": (
            "AI buat marketing udah bukan masa depan. UMKM bisa pake "
            "sekarang juga — dari bikin konten sampe chatbot.\n\n"
            "AI itu alat, bukan pengganti otak. Strategi tetap dari kita.\n\n"
            "Panduan lengkap:\n{url}"
        ),
    },
    {
        "id": 6,
        "title": "Tips Social Media Marketing untuk UMKM dengan Budget Pas-pasan",
        "url": "https://studiosoft.id/social-media-marketing-umkm-budget-minim/",
        "topic": "Social Media UMKM",
        "fb": (
            "Banyak UMKM mikir social media marketing butuh budget besar. "
            "Padahal dengan strategi yang tepat, hasil maksimal bisa diraih "
            "dengan budget pas-pasan.\n\n"
            "Kuncinya ada di kreativitas, konsistensi, dan pemahaman platform. "
            "Pilih platform yang tepat, bikin konten yang relevan, dan "
            "bangun engagement secara organik.\n\n"
            "Tips lengkapnya:\n{url}\n\n"
            "#SocialMediaMarketing #UMKM #DigitalMarketing #StudioSoft #TipsBisnis"
        ),
        "linkedin": (
            "Social media marketing dengan budget pas-pasan — mungkinkah?\n\n"
            "Jawabannya: sangat mungkin. Banyak UMKM membuktikan bahwa "
            "dengan strategi konten yang tepat dan konsistensi, mereka bisa "
            "mendapatkan engagement yang lebih baik daripada kompetitor dengan "
            "budget iklan besar.\n\n"
            "Kuncinya: pahami audiens, pilih platform yang tepat, dan "
            "ukur setiap langkah.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "Social media marketing gak harus mahal. Kuncinya: "
            "kreativitas, konsistensi, dan paham platform.\n\n"
            "Pilih platform yang tepat, bikin konten relevan, "
            "bangun engagement organik.\n\n"
            "Tips lengkap:\n{url}"
        ),
    },
    {
        "id": 7,
        "title": "Riset Keyword untuk Pemula: Cara Gampang Temukan Kata Kunci",
        "url": "https://studiosoft.id/riset-keyword-untuk-pemula/",
        "topic": "Riset Keyword SEO",
        "fb": (
            "Riset keyword adalah langkah paling fundamental dalam SEO. "
            "Tanpa keyword yang tepat, konten terbaik pun sulit ditemukan "
            "di mesin pencarian.\n\n"
            "Untungnya, riset keyword gak sesulit yang dibayangkan. "
            "Dengan tools gratis seperti Google Keyword Planner, Ubersuggest, "
            "atau AnswerThePublic, kamu bisa menemukan kata kunci yang "
            "tepat untuk bisnismu.\n\n"
            "Panduan pemula lengkap:\n{url}\n\n"
            "#RisetKeyword #SEO #DigitalMarketing #StudioSoft #TipsSEO"
        ),
        "linkedin": (
            "Riset keyword: fondasi SEO yang sering diabaikan.\n\n"
            "Banyak bisnis langsung membuat konten tanpa riset keyword "
            "terlebih dahulu. Hasilnya? Konten bagus tapi tidak ditemukan "
            "siapa-siapa.\n\n"
            "Riset keyword yang tepat membantu Anda memahami apa yang "
            "sebenarnya dicari audiens — bukan hanya apa yang ingin "
            "Anda tulis.\n\n"
            "Panduan riset keyword untuk pemula:\n{url}"
        ),
        "threads": (
            "Riset keyword itu fondasi SEO. Tanpa ini, konten sebagus "
            "apapun bakal sepi.\n\n"
            "Tools gratis kaya Google Keyword Planner, Ubersuggest, "
            "AnswerThePublic bisa jadi temen belajar.\n\n"
            "Panduan lengkap:\n{url}"
        ),
    },
    {
        "id": 8,
        "title": "Pentingnya Landing Page untuk Bisnis Kecil di Era Digital",
        "url": "https://studiosoft.id/pentingnya-landing-page-bisnis-kecil/",
        "topic": "Landing Page Bisnis Kecil",
        "fb": (
            "Landing page adalah salah satu senjata paling ampuh buat "
            "bisnis kecil di era digital. Halaman yang fokus pada satu "
            "tujuan ini bisa mengubah pengunjung biasa jadi pelanggan.\n\n"
            "Beda sama website biasa, landing page dirancang khusus "
            "buat konversi — entah itu daftar email, beli produk, "
            "atau daftar konsultasi. Satu halaman, satu tujuan, satu CTA.\n\n"
            "Panduan lengkap bikin landing page:\n{url}\n\n"
            "#LandingPage #BisnisKecil #DigitalMarketing #StudioSoft #Konversi"
        ),
        "linkedin": (
            "Landing page: senjata rahasia bisnis kecil untuk konversi.\n\n"
            "Banyak bisnis kecil memiliki website tapi tidak memiliki "
            "landing page yang efektif. Padahal, landing page yang "
            "dirancang dengan baik bisa meningkatkan conversion rate "
            "hingga 3-5 kali lipat.\n\n"
            "Satu halaman, satu tujuan, satu CTA — itulah kuncinya.\n\n"
            "Panduan lengkap:\n{url}"
        ),
        "threads": (
            "Landing page itu senjata ampuh bisnis kecil. "
            "Satu halaman, satu tujuan, satu CTA.\n\n"
            "Bisa naikin konversi 3-5x lipat kalo dirancang dengan baik.\n\n"
            "Panduan lengkap:\n{url}"
        ),
    },
    {
        "id": 9,
        "title": "Cara Membangun Brand Awareness Lewat Digital Marketing",
        "url": "https://studiosoft.id/membangun-brand-awareness-digital-marketing/",
        "topic": "Brand Awareness Digital",
        "fb": (
            "Brand awareness adalah fondasi utama bisnis yang kuat. "
            "Tanpa kesadaran merek, calon pelanggan tidak akan mengenal, "
            "apalagi memilih produk Anda.\n\n"
            "Untungnya, digital marketing membuka banyak cara untuk "
            "membangun brand awareness — dari content marketing, "
            "media sosial, SEO, sampai kolaborasi influencer. "
            "Pilih yang paling sesuai dengan karakter bisnis Anda.\n\n"
            "Strategi lengkap:\n{url}\n\n"
            "#BrandAwareness #DigitalMarketing #Branding #StudioSoft #StrategiBrand"
        ),
        "linkedin": (
            "Cara membangun brand awareness melalui digital marketing.\n\n"
            "Brand awareness bukan sekadar membuat orang tahu nama merek "
            "Anda. Lebih dari itu, brand awareness adalah membuat orang "
            "memahami nilai dan keunikan yang Anda tawarkan.\n\n"
            "Di era digital, ada banyak kanal yang bisa dimanfaatkan: "
            "konten edukatif di blog, kehadiran aktif di media sosial, "
            "kampanye SEO, hingga kolaborasi dengan pihak ketiga.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "Brand awareness bukan cuma bikin orang tahu nama lo. "
            "Tapi bikin mereka paham nilai yang lo tawarkan.\n\n"
            "Content marketing, SEO, sosial media, kolaborasi — "
            "banyak cara buat bangun brand awareness.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
    },
    {
        "id": 10,
        "title": "Cara Bikin Konten Instagram yang Menarik dan Laris Manis",
        "url": "https://studiosoft.id/cara-bikin-konten-instagram/",
        "topic": "Konten Instagram",
        "fb": (
            "Instagram masih jadi platform paling efektif untuk promosi "
            "bisnis di 2026. Tapi persaingan makin ketat — konten biasa "
            "bakal tenggelam.\n\n"
            "Rahasia konten IG yang laris: pahami audiens, konsisten "
            "dengan visual branding, pakai copywriting yang nyambung, "
            "dan jangan lupa interaksi di kolom komentar.\n\n"
            "Panduan lengkap bikin konten IG:\n{url}\n\n"
            "#KontenInstagram #SocialMedia #DigitalMarketing #StudioSoft #TipsIG"
        ),
        "linkedin": (
            "Cara membuat konten Instagram yang menarik dan efektif.\n\n"
            "Instagram tetap menjadi platform kunci untuk visual marketing "
            "di tahun 2026. Namun, dengan algoritma yang terus berubah "
            "dan persaingan yang semakin ketat, pendekatan 'asal posting' "
            "sudah tidak lagi mempan.\n\n"
            "Dibutuhkan strategi konten yang matang: dari riset audiens, "
            "perencanaan visual, hingga copywriting yang tepat sasaran.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "Instagram 2026 makin ketat. Konten biasa bakal tenggelam.\n\n"
            "Rahasia: pahami audiens, konsisten visual, copywriting "
            "yang nyambung, dan rajin interaksi.\n\n"
            "Panduan lengkap:\n{url}"
        ),
    },
    {
        "id": 11,
        "title": "Perbedaan On-Page SEO dan Off-Page SEO yang Perlu Dipahami",
        "url": "https://studiosoft.id/perbedaan-onpage-offpage-seo/",
        "topic": "SEO On-Page Off-Page",
        "fb": (
            "Dua pilar utama SEO yang wajib dipahami: On-Page dan Off-Page.\n\n"
            "On-Page SEO adalah optimasi di dalam website — konten, "
            "meta tag, struktur URL, kecepatan loading. Sementara "
            "Off-Page SEO adalah optimasi di luar website — backlink, "
            "sosial sinyal, brand mention.\n\n"
            "Keduanya saling melengkapi. Tanpa salah satu, SEO kamu "
            "gak akan maksimal.\n\n"
            "Baca perbedaan lengkapnya:\n{url}\n\n"
            "#SEO #OnPageSEO #OffPageSEO #DigitalMarketing #StudioSoft"
        ),
        "linkedin": (
            "Memahami perbedaan On-Page SEO dan Off-Page SEO.\n\n"
            "Banyak pemula SEO yang fokus pada satu aspek saja — "
            "padahal keduanya sama pentingnya. On-Page SEO adalah "
            "fondasi yang membuat website Anda layak di-index Google, "
            "sementara Off-Page SEO membangun otoritas yang membuat "
            "Anda layak berada di peringkat atas.\n\n"
            "Strategi yang seimbang adalah kunci kesuksesan SEO.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "On-Page vs Off-Page SEO: dua pilar yang saling melengkapi.\n\n"
            "On-Page: optimasi di dalam website (konten, meta, speed).\n"
            "Off-Page: optimasi di luar (backlink, sinyal sosial).\n\n"
            "Keduanya wajib. Gak bisa milih salah satu.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
    },
    {
        "id": 12,
        "title": "Jasa Pembuatan Website Surabaya untuk Bisnis Pemula",
        "url": "https://studiosoft.id/jasa-pembuatan-website-surabaya/",
        "topic": "Jasa Website Surabaya",
        "fb": (
            "Mau bikin website untuk bisnis di Surabaya? Pastikan "
            "kamu pilih jasa yang tepat — bukan cuma yang murah.\n\n"
            "Website adalah etalase digital bisnis kamu. Kalo "
            "etalasenya jelek, orang gak akan percaya. Perhatikan "
            "portofolio, tech stack, support, dan transparansi harga.\n\n"
            "Panduan milih jasa website di Surabaya:\n{url}\n\n"
            "#JasaWebsite #WebsiteSurabaya #BisnisPemula #StudioSoft #WebDev"
        ),
        "linkedin": (
            "Tips memilih jasa pembuatan website di Surabaya.\n\n"
            "Bagi bisnis pemula, memiliki website profesional adalah "
            "langkah krusial. Namun, banyak yang terjebak memilih "
            "jasa pembuatan website hanya berdasarkan harga murah.\n\n"
            "Yang perlu diperhatikan: portofolio, teknologi yang "
            "digunakan, dukungan pasca-launch, dan yang terpenting — "
            "apakah websitenya bisa diurus sendiri atau tidak.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "Milih jasa website di Surabaya? Jangan coba liat harga "
            "doang. Cek portofolio, tech stack, support.\n\n"
            "Website itu etalase digital. Etalase jelek = gak dipercaya.\n\n"
            "Panduan lengkap:\n{url}"
        ),
    },
    {
        "id": 13,
        "title": "Strategi Digital Marketing 2026 yang Wajib Pelaku Bisnis Tahu",
        "url": "https://studiosoft.id/strategi-digital-marketing-2026/",
        "topic": "Digital Marketing 2026",
        "fb": (
            "Dunia digital marketing terus berubah. Yang berhasil "
            "tahun lalu belum tentu efektif tahun ini.\n\n"
            "Di 2026, beberapa tren yang wajib diperhatikan: AI-powered "
            "marketing, personalisasi super, video pendek yang dominan, "
            "SEO berbasis search intent, dan community-driven branding.\n\n"
            "Siap-siap update strategi digital marketingmu:\n{url}\n\n"
            "#DigitalMarketing2026 #StrategiMarketing #Tren2026 #StudioSoft #BisnisDigital"
        ),
        "linkedin": (
            "Strategi digital marketing 2026 yang wajib diketahui pelaku bisnis.\n\n"
            "Lanskap digital marketing terus berevolusi. AI kini menjadi "
            "bagian integral dari strategi marketing, video pendek mendominasi "
            "konsumsi konten, dan konsumen semakin menuntut personalisasi.\n\n"
            "Bisnis yang tidak beradaptasi dengan tren ini berisiko "
            "tertinggal dari kompetitor yang lebih agile.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
        "threads": (
            "Digital marketing 2026: AI makin dominan, video pendek "
            "rajai konten, personalisasi jadi standar.\n\n"
            "Yang gak update bakal ketinggalan.\n\n"
            "Baca selengkapnya:\n{url}"
        ),
    },
]

def schedule_post(account_id, text, post_type="text", topic="", thumbnail_path=None):
    now = datetime.now(WIB) + timedelta(minutes=3)
    iso = now.strftime("%Y-%m-%dT%H:%M:00+07:00")
    
    medias = []
    if thumbnail_path:
        img_url = upload_image_to_server(thumbnail_path)
        # FIX 21/08: no base64 — image via server OpenClaw
        medias.append({
            "url": img_url,
            "type": "image",
            "alt": "Thumbnail artikel"
        })
    
    payload = {
        "title": "",
        "description": text[:500] if post_type != "text" else text,
        "topic": topic,
        "type": post_type,
        "medias": 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", "?"), iso

def get_posted_ids():
    if not os.path.exists(LOG_FILE):
        return set()
    with open(LOG_FILE) as f:
        return set(line.strip() for line in f if line.strip().isdigit())

def main():
    posted_ids = get_posted_ids()
    
    # Cari artikel yang belum dipost
    for artikel in ARTIKEL:
        if str(artikel["id"]) in posted_ids:
            continue
        
        url = artikel["url"]
        topic = artikel["topic"]
        results = []
        
        print(f"\n📝 Posting artikel #{artikel['id']}: {artikel['title']}")
        
        # Generate thumbnail dulu
        thumb_path = generate_thumbnail(artikel['id'], artikel['title'], artikel['topic'])
        print(f"  ✅ Thumbnail generated")
        
        # FB
        fb_text = artikel["fb"].format(url=url)
        try:
            sid, iso = schedule_post(ACCOUNTS["fb"], fb_text, topic=topic, thumbnail_path=thumb_path)
            results.append(f"✅ FB → {sid}")
            print(f"  ✅ FB → {sid}")
        except Exception as e:
            results.append(f"❌ FB: {str(e)[:60]}")
            print(f"  ❌ FB: {e}")
        
        # LinkedIn
        li_text = artikel["linkedin"].format(url=url)
        try:
            sid, iso = schedule_post(ACCOUNTS["linkedin"], li_text, topic=topic, thumbnail_path=thumb_path)
            results.append(f"✅ LinkedIn → {sid}")
            print(f"  ✅ LinkedIn → {sid}")
        except Exception as e:
            results.append(f"❌ LinkedIn: {str(e)[:60]}")
            print(f"  ❌ LinkedIn: {e}")
        
        # Threads
        thr_text = artikel["threads"].format(url=url)
        try:
            sid, iso = schedule_post(ACCOUNTS["threads"], thr_text, topic=topic, thumbnail_path=thumb_path)
            results.append(f"✅ Threads → {sid}")
            print(f"  ✅ Threads → {sid}")
        except Exception as e:
            results.append(f"❌ Threads: {str(e)[:60]}")
            print(f"  ❌ Threads: {e}")
        
        # Log
        with open(LOG_FILE, "a") as f:
            f.write(f"{artikel['id']}\n")
        
        print(f"  ✅ Logged artikel #{artikel['id']}")
        print("\n" + "=" * 50)
        return "\n".join(results)
    
    print("✅ Semua artikel udah dipost! Nggak ada artikel baru buat hari ini.")
    return "DONE ALL"

if __name__ == "__main__":
    result = main()
    print(f"\n{result}")

