#!/usr/bin/env python3
"""StudioSoft Carousel — Schedule Bulan Juli 2026
Pola bergantian: BIRU ↔ PUTIH
31 hari (1-31 Juli)
Jam tayang: 08:00 WIB (01:00 UTC)
Style: sesuai aturan IG Story StudioSoft
Resolusi: 1080×1920 portrait
Font: Poppins
Versi Biru: bg #1E40AF, text putih
Versi Putih: bg #FFFFFF, text BIRU (#1E40AF) — JANGAN pakai hitam
"""

from PIL import Image, ImageDraw, ImageFont
import base64, json, os, random, urllib.request
from datetime import datetime, timezone, timedelta

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

# CREDENTIALS



def read_b64(filepath):
    """Baca file, return base64"""
    with open(filepath, "rb") as f:
        return base64.b64encode(f.read()).decode()

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

W, H = 1080, 1350
M = 65
MAX_W = W - M - 50  # 965

# Warna
BIRU = (30, 64, 175)
PUTIH = (255, 255, 255)
BIRU_TUA = (30, 64, 175)  # #1E40AF — untuk font di BG putih

# Font
FONT_TITLE = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 100)
FONT_BODY = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 32)
FONT_BOLD24 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 24)
FONT_REG20 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 20)
FONT_REG22 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 22)
FONT_COVER = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 130)

# 31 TEMA CAROUSEL STUDIOSOFT — beda tiap hari!
THEMES = [
    ("Mengapa Website Penting untuk Bisnis?", "Website adalah wajah digital bisnis Anda. 90% konsumen mencari online sebelum membeli."),
    ("Tips Memilih Domain yang Tepat", "Domain yang baik: singkat, relevan, mudah diingat, pakai ekstensi .id atau .com."),
    ("Website vs Social Media", "Sosmed hanya tempat numpang. Website adalah aset digital Anda sendiri."),
    ("5 Fitur Wajib Website UMKM", "Mobile-friendly, loading cepat, WA terintegrasi, galeri produk, testimoni."),
    ("Keamanan Website Penting!", "SSL, backup rutin, update CMS — jangan sampai website Anda diretas!"),
    ("SEO untuk Pemula", "Riset kata kunci, konten berkualitas, meta deskripsi, internal link."),
    ("Desain Website yang Meningkatkan Penjualan", "Navigasi jelas, CTA strategis, warna brand konsisten."),
    ("Mobile-First: Kenapa Penting?", "70% traffic dari HP. Website harus responsif!"),
    ("Kecepatan Website Mempengaruhi Konversi", "Bahkan 1 detik delay bisa turunkan konversi 7%."),
    ("CMS Terbaik untuk UMKM", "WordPress, Webflow, atau custom? Pilih sesuai kebutuhan!"),
    ("Website + SEO = Traffic Organik", "Konten berkualitas + optimasi = pengunjung gratis tiap hari."),
    ("Integrasi WhatsApp di Website", "Customer bisa langsung chat dengan satu klik. Konversi naik!"),
    ("Portofolio Online: Kunci Kepercayaan Klien", "Tampilkan karya terbaik Anda di website portofolio."),
    ("Blog untuk Bisnis: Masih Relevan?", "Blog = mesin traffic jangka panjang. 77% user baca blog sebelum beli."),
    ("E-commerce untuk Pemula", "Bikin toko online sendiri tanpa platform pihak ketiga."),
    ("Hosting yang Bagus Seperti Apa?", "Fast loading, support 24/7, backup harian, SSL gratis."),
    ("Website Landing Page vs Multi Halaman", "Landing page untuk campaign, multi-page untuk brand profile."),
    ("Copywriting untuk Website", "Headline kuat, value proposition jelas, bahasa audiens."),
    ("Gambar dan Video di Website", "Visual berkualitas naikin engagement. Optimalisasi ukuran file."),
    ("Analytics: Pantau Pengunjung Website", "Google Analytics — tahu dari mana visitor, apa yang mereka klik."),
    ("A/B Testing untuk Optimasi", "Uji dua versi halaman, pakai yang konversinya lebih tinggi."),
    ("Website Company Profile", "Identitas brand, visi misi, layanan, tim — semua dalam satu halaman."),
    ("Maintenance Website Rutin", "Update konten, cek broken link, backup database — setiap bulan!"),
    ("Integrasi Sosial Media di Website", "Embed IG feed, tombol share, login via sosmed."),
    ("Multi Bahasa Website", "Jangkau lebih banyak audiens dengan website bilingual."),
    ("Website untuk Startup", "MVP landing page, investor deck, signup form — cepat launching."),
    ("Apa Itu SSL dan Kenapa Penting?", "Enkripsi data pengunjung, naikin peringkat Google, bikin percaya."),
    ("Website Donasi/Layanan Publik", "Form donasi terintegrasi payment gateway untuk NGO."),
    ("Custom Web App vs Template", "Template cepat murah, custom sesuai kebutuhan spesifik."),
    ("Digital Marketing + Website = Duet", "Tanpa website, iklan digital Anda tidak maksimal."),
    ("Masa Depan Website: Apa yang Perlu Disiapkan?", "AI chatbot, voice UI, personalisasi konten adalah tren 2026."),
]

CAPTION = (
    "Temukan solusi digital terbaik untuk bisnis Anda bersama StudioSoft! 🚀\n\n"
    "Dari website company profile, toko online, hingga aplikasi custom — "
    "kami siap bantu bisnis Anda naik kelas di era digital.\n\n"
    "Website bukan lagi pilihan, tapi kebutuhan."
)
HASHTAG = "#StudioSoft #Website #DigitalMarketing #JasaWebsite #WebDeveloperIndonesia #BisnisOnline"


def wrap_text(draw, text, font, max_w=MAX_W):
    lines = []
    for para in text.split("\n"):
        words = para.split()
        cur = ""
        for w in words:
            test = cur + " " + w if cur else w
            if draw.textbbox((0,0), test, font=font)[2] > max_w - 30 and cur:
                lines.append(cur)
                cur = w
            else:
                cur = test
        if cur: lines.append(cur)
    return lines


def gen_carousel(out_dir, day_num, theme_title, theme_desc, bg_color, text_color):
    """Generate 5 slide carousel (lebih ringan dari 10 slide)."""
    os.makedirs(out_dir, exist_ok=True)
    files = []
    
    def hdr(drw, p):
        drw.text((M, M), "STUDIOSOFT", font=FONT_BOLD24, fill=text_color)
        drw.text((W-M, M), p, font=FONT_REG22, fill=text_color, anchor="rt")
    def ftr(drw, r=""):
        drw.text((M, H-55), "www.studiosoft.id", font=FONT_REG20, fill=text_color)
        if r: drw.text((W-M, H-55), r, font=FONT_REG20, fill=text_color, anchor="rt")
    def dt(drw, texts, sy, font=FONT_TITLE, ls=1.3):
        all_l = []
        for t in texts: all_l.extend(wrap_text(drw, t, font, MAX_W-40))
        cy = sy
        for line in all_l:
            drw.text((M, cy), line, font=font, fill=text_color)
            lh = drw.textbbox((0,0),line,font=font)[3] - drw.textbbox((0,0),line,font=font)[1]
            cy += int(lh*ls)
        return cy
    
    def db(drw, texts, sy, font=FONT_BODY, ls=1.5):
        all_l = []
        for t in texts: all_l.extend(wrap_text(drw, t, font, MAX_W-40))
        cy = sy
        for line in all_l:
            drw.text((M, cy), line, font=font, fill=text_color)
            lh = drw.textbbox((0,0),line,font=font)[3] - drw.textbbox((0,0),line,font=font)[1]
            cy += int(lh*ls)
        return cy
    
    # COVER
    img = Image.new("RGB", (W, H), bg_color)
    d = ImageDraw.Draw(img)
    hdr(d, f"{day_num}/31")
    ey = dt(d, [theme_title], 200, FONT_COVER)
    cy = ey + 100
    for line in wrap_text(d, theme_desc, FONT_BODY, MAX_W-40):
        d.text((M, cy), line, font=FONT_BODY, fill=text_color)
        cy += 46
    ftr(d, "#StudioSoft")
    fp = os.path.join(out_dir, "01_cover.png")
    img.save(fp)
    files.append(fp)
    
    # SLIDE 2-5: tips terkait tema
    TIPS_BY_THEME = {
        "Mengapa Website Penting untuk Bisnis?": [
            "90% konsumen cek online sebelum beli — tanpa website Anda tidak terlihat.",
            "Website 24/7 — toko offline tutup jam 9, website kerja terus.",
            "Kredibilitas: bisnis tanpa website dianggap tidak profesional.",
        ],
        "Tips Memilih Domain yang Tepat": [
            "Gunakan nama brand, hindari angka dan strip berlebihan.",
            "Ekstensi .id untuk target lokal, .com untuk global.",
            "Cek ketersediaan di registrar terpercaya (Niagahoster, DomaiNesia).",
        ],
        "Website vs Social Media": [
            "Sosmed sewa lahan — website punya tanah sendiri.",
            "Algoritma sosmed berubah — traffic website Anda kontrol penuh.",
            "Website pusat, sosmed cabang — integrasikan keduanya.",
        ],
        "5 Fitur Wajib Website UMKM": [
            "Responsive — tampil sempurna di HP, tablet, dan desktop.",
            "WA button — pelanggan bisa chat langsung dengan satu klik.",
            "Galeri produk — foto berkualitas dengan deskripsi jelas.",
        ],
        "Keamanan Website Penting!": [
            "SSL certificate — enkripsi data dan naikin peringkat Google.",
            "Update rutin CMS, plugin, dan theme — jangan tunda!",
            "Backup otomatis — siap-siap kalau terjadi masalah.",
        ],
        "SEO untuk Pemula": [
            "Riset kata kunci: Google Keyword Planner, Ubersuggest.",
            "Setiap halaman harus punya meta title dan description unik.",
            "Internal link: hubungkan halaman yang relevan.",
        ],
        "Desain Website yang Meningkatkan Penjualan": [
            "Navigasi sederhana — pengunjung nemu apa yang dicari dalam 3 klik.",
            "CTA strategis — tombol terlihat, warna kontras, copy jelas.",
            "Testimoni dan trust signal — bukti sosial tingkatkan konversi.",
        ],
        "Mobile-First: Kenapa Penting?": [
            "Google pake mobile-first indexing — versi HP menentukan ranking.",
            "70%+ traffic Indonesia dari smartphone.",
            "Tombol dan teks harus nyaman di layar kecil.",
        ],
        "Kecepatan Website Mempengaruhi Konversi": [
            "Target loading time di bawah 3 detik.",
            "Kompres gambar, gunakan caching, pilih hosting cepat.",
            "Google PageSpeed Insights — ukur dan optimasi.",
        ],
        "CMS Terbaik untuk UMKM": [
            "WordPress — 43% website dunia, paling fleksibel.",
            "Webflow — desain visual tanpa coding.",
            "Custom CMS — fitur sesuai kebutuhan spesifik bisnis.",
        ],
        "Website + SEO = Traffic Organik": [
            "Konten blog berkualitas — traffic gratis jangka panjang.",
            "Backlink dari website terpercaya naikin otoritas domain.",
            "SEO butuh konsistensi — hasil tidak instan tapi bertahan lama.",
        ],
        "Integrasi WhatsApp di Website": [
            "WA API atau WA.me link — pilih sesuai volume chat.",
            "Tombol WA floating di pojok — customer bisa chat kapan saja.",
            "Auto-reply WA bot untuk jam di luar operasional.",
        ],
        "Portofolio Online: Kunci Kepercayaan Klien": [
            "Tampilkan case study — masalah, solusi, hasil.",
            "Foto proyek berkualitas tinggi — pertama impressi penting.",
            "Testimoni klien asli — bukti sosial paling kuat.",
        ],
        "Blog untuk Bisnis: Masih Relevan?": [
            "Perusahaan dengan blog dapat 67% lebih banyak leads.",
            "Blog = konten segar yang Google sukai untuk ranking.",
            "Blog positioning sebagai expert di bidang Anda.",
        ],
        "E-commerce untuk Pemula": [
            "WordPress + WooCommerce — solusi toko online termudah.",
            "Payment gateway: Midtrans, Xendit, atau manual transfer.",
            "Integrasi expedisi — customer cek ongkir real-time.",
        ],
        "Hosting yang Bagus Seperti Apa?": [
            "Uptime minimal 99.9% — website jangan sering down.",
            "Support 24/7 — kalau ada masalah cepat ditangani.",
            "Free SSL, backup harian, dan migrasi gratis.",
        ],
        "Website Landing Page vs Multi Halaman": [
            "Landing page: fokus 1 tujuan (jualan, daftar, download).",
            "Multi-page: company profile lengkap dengan blog.",
            "Tips: mulai dengan landing page, kembangkan bertahap.",
        ],
        "Copywriting untuk Website": [
            "Headline maksimal 10 kata — langsung sampaikan value.",
            "Bahasa sesuai target audiens — formal/profesional atau santai.",
            "AIDA: Attention, Interest, Desire, Action.",
        ],
        "Gambar dan Video di Website": [
            "Gambar produk dari berbagai angle — bangun kepercayaan.",
            "Video explainer 60-90 detik — jelaskan produk dengan cepat.",
            "Optimasi: format WebP, kompresi tanpa kurangi kualitas.",
        ],
        "Analytics: Pantau Pengunjung Website": [
            "Google Analytics 4 — standar industri tracking website.",
            "Pantau: sumber traffic, halaman populer, bounce rate.",
            "Data-driven decision — optimasi berdasarkan data nyata.",
        ],
        "A/B Testing untuk Optimasi": [
            "Uji 2 versi landing page — beda headline, CTA, atau gambar.",
            "Tools: Google Optimize, Optimizely, VWO.",
            "Satu perubahan kecil bisa naikin konversi signifikan.",
        ],
        "Website Company Profile": [
            "Halaman Tentang Kami — cerita brand yang autentik.",
            "Visi misi — arah bisnis yang jelas dan inspiratif.",
            "Tim — wajah di balik brand, bangun koneksi personal.",
        ],
        "Maintenance Website Rutin": [
            "Update konten minimal sebulan sekali — blog lebih sering.",
            "Cek broken link — jangan ada halaman error 404.",
            "Review keamanan dan update versi CMS.",
        ],
        "Integrasi Sosial Media di Website": [
            "Embed Instagram feed — tampilkan konten terbaru.",
            "Share button — memudahkan pengunjung membagikan konten.",
            "Login via Google/Facebook — kurangi friction pendaftaran.",
        ],
        "Multi Bahasa Website": [
            "Jangkau pasar lebih luas — Indonesia butuh Bahasa Indonesia + Inggris.",
            "Plugin WPML atau Polylang untuk WordPress multi bahasa.",
            "Hati-hati dengan terjemahan otomatis — kualitas tetap prioritas.",
        ],
        "Website untuk Startup": [
            "Landing page cepat launch — minimal viable product.",
            "Email capture form — bangun mailing list sejak awal.",
            "Investor deck atau pitch deck bisa diembed.",
        ],
        "Apa Itu SSL dan Kenapa Penting?": [
            "SSL = Secure Sockets Layer — enkripsi data pengunjung.",
            "Google memberi peringkat lebih tinggi untuk website HTTPS.",
            "Browser warning 'Not Secure' bikin pengunjung kabur.",
        ],
        "Website Donasi/Layanan Publik": [
            "Integrasi payment gateway untuk donasi online.",
            "Transparansi: laporan penggunaan dana di website.",
            "Form pendaftaran online untuk program publik.",
        ],
        "Custom Web App vs Template": [
            "Template: cepat, murah, cocok untuk standar kebutuhan.",
            "Custom: fleksibel, scalable, sesuai proses bisnis unik.",
            "Pilih custom kalau proses bisnis Anda kompleks.",
        ],
        "Digital Marketing + Website = Duet": [
            "Iklan Google/Facebook arahkan ke website, bukan IG profile.",
            "Landing page khusus campaign — tingkatkan konversi iklan.",
            "Retargeting — kejar pengunjung website yang belum beli.",
        ],
        "Masa Depan Website": [
            "AI chatbot — layanan pelanggan 24/7 otomatis.",
            "Voice search optimization — website harus siap.",
            "Personalisasi konten — setiap pengunjung lihat versi berbeda.",
        ],
    }
    
    slide_titles = [
        "Kunci Sukses",
        "Tips Penting",
        "Langkah Awal",
        "Yang Perlu Diketahui",
    ]
    slide_rights = ["#StudioSoft", "#TipsWebsite #StudioSoft", "#Digital #StudioSoft", "#WebDev #StudioSoft"]
    
    tips = TIPS_BY_THEME.get(theme_title, ["Tips ini akan membantu Anda memahami topik lebih dalam."])
    # Make sure we have at least 1 tip per slide
    tips_all = []
    for i in range(1, 5):
        if i <= len(tips):
            tips_all.append(tips[i-1])
        else:
            tips_all.append(tips[0])
    
    for i in range(4):
        img = Image.new("RGB", (W, H), bg_color)
        d = ImageDraw.Draw(img)
        hdr(d, f"{day_num}/31")
        ey = dt(d, [slide_titles[i]], 200)
        cy = ey + 80
        
        # Show tips for this slide
        lines = wrap_text(d, tips_all[i], FONT_BODY, MAX_W-40)
        for line in lines:
            d.text((M, cy), f"  \u2022  {line}", font=FONT_BODY, fill=text_color)
            cy += 48
        
        ftr(d, slide_rights[i])
        fp = os.path.join(out_dir, f"slide_{i+2:02d}.png")
        img.save(fp)
        files.append(fp)
    
    return files


def upload(files, schedule_utc):
    medias = []
    for fp in files:
        # FIX 21/08: image via server OpenClaw
        img_url = read_b64(fp)
        medias.append({"url": img_url, "type": "image"})

    payload = {
        "title": "", "description": f"{CAPTION}\n\n{HASHTAG}",
        "topic": "Website & Digital Marketing", "type": "album",
        "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": schedule_utc,
    }

    body = json.dumps(payload).encode()
    req = urllib.request.Request(f"{BASE_URL}/public/schedule", data=body, headers=HEADERS, method="POST")
    try:
        with urllib.request.urlopen(req) as r:
            return json.loads(r.read()).get("scheduleId", "?")
    except urllib.error.HTTPError as e:
        return None


# ===== MAIN =====
BASE = os.path.expanduser("~/.openclaw/workspace-atun")
results = []

schedule_date = datetime(2026, 7, 1, 1, 0, 0, tzinfo=timezone.utc)  # 08:00 WIB

for day_off in range(31):
    dt = schedule_date + timedelta(days=day_off)
    day_num = dt.day
    utc = dt.strftime("%Y-%m-%dT%H:%M:%S.000Z")
    wib = dt + timedelta(hours=7)
    wib_s = wib.strftime("%d %b %Y 08:00 WIB")

    # BG bergantian: mulai 1 Jul = BIRU, 2 Jul = PUTIH...
    bg_color, text_color = (BIRU, PUTIH) if day_num % 2 == 1 else (PUTIH, BIRU_TUA)
    variant = "BIRU" if day_num % 2 == 1 else "PUTIH"
    theme_title, theme_desc = THEMES[day_off]

    print(f"\n{'='*60}")
    print(f"📅 {wib_s} — {variant}")
    print(f"🎯 {theme_title}")

    out_dir = os.path.join(BASE, f"studiosoft_batch/{dt.strftime('%Y%m%d')}")
    files = gen_carousel(out_dir, day_num, theme_title, theme_desc, bg_color, text_color)
    print(f"  📂 {len(files)} files")

    sid = upload(files, utc)
    if sid:
        print(f"  ✅ ID: {sid}")
        results.append((wib_s, variant, "✅", sid))
    else:
        print(f"  ❌ Gagal")
        results.append((wib_s, variant, "❌", "-"))
    random.seed()

print(f"\n\n{'='*60}")
print("📊 SCHEDULE STUDIOSOFT CAROUSEL — JULI 2026")
print(f"{'='*60}")
for d, v, s, sid in results:
    print(f"  {d:32s} | {v:5s} | {s}")
print(f"\n✅ {sum(1 for r in results if r[2]=='✅')}/{len(results)} sukses!")

