#!/usr/bin/env python3
"""GEO Carousel StudioSoft — format 4:5 (1080×1350) persis referensi lama.
Design: clean minimal, bold typography, sesuai batch yg Bos approve.
JPG output.
"""
from PIL import Image, ImageDraw, ImageFont
import base64, json, os, urllib.request, urllib.error
from repliz_client import HEADERS, BASE_URL

OUT_DIR = "/home/mantapman/.hermes/profiles/atun/workspace/studiosoft_geo_45"
os.makedirs(OUT_DIR, exist_ok=True)

# ── ATURAN FORMAT LAMA (1080×1350 = 4:5) ──
W, H = 1080, 1350
M = 65
MX = W - 2*M  # 950

BLUE = "#1E40AF"
WHITE = "#FFFFFF"
ACCENT = "#DBEAFE"

FD = "/home/mantapman/.fonts/poppins"

def ft(name, sz):
    return ImageFont.truetype(f"{FD}/Poppins-{name}.ttf", sz)

# Font — sesuai style lama
B130 = ft("Bold", 130)
B110 = ft("Bold", 110)
B100 = ft("Bold", 100)
B80  = ft("Bold", 80)
B70  = ft("Bold", 70)
B60  = ft("Bold", 60)
B55  = ft("Bold", 55)
B50  = ft("Bold", 50)
B45  = ft("Bold", 45)
B40  = ft("Bold", 40)
B24  = ft("Bold", 24)
SB45 = ft("SemiBold", 45)
SB40 = ft("SemiBold", 40)
SB36 = ft("SemiBold", 36)
R36  = ft("Regular", 36)
R32  = ft("Regular", 32)
R28  = ft("Regular", 28)
R24  = ft("Regular", 24)
R20  = ft("Regular", 20)

def wp(d, tx, fn, mw):
    """Text wrap."""
    ls = []
    for p in tx.split('\n'):
        if not p.strip():
            ls.append(('', fn))
            continue
        ws = p.split()
        c = ""
        for w in ws:
            if d.textlength(c + w + " ", font=fn) <= mw:
                c += w + " "
            else:
                if c: ls.append((c.rstrip(), fn))
                c = w + " "
        if c.strip(): ls.append((c.rstrip(), fn))
    return ls

# ════════════ SLIDE 1 — COVER ════════════
def s1():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    
    # Header
    draw.text((M, M), "StudioSoft", fill=ACCENT, font=B24)
    draw.text((W-M, M), "1/5", fill=ACCENT, font=B24, anchor="ra")
    
    # Title
    draw.text((M, 200), "GEO", fill=WHITE, font=B130)
    draw.text((M, 350), "Generative Engine", fill=ACCENT, font=SB45)
    draw.text((M, 410), "Optimization", fill=ACCENT, font=SB45)
    
    # Divider line
    draw.rectangle([(M, 480), (W-M, 482)], fill=ACCENT)
    
    # Subtitle
    draw.text((M, 550), "Strategi Baru Biar Brandmu", fill=WHITE, font=B60)
    draw.text((M, 625), "Disebut di Jawaban AI", fill=WHITE, font=B60)
    
    # Description
    draw.text((M, 760), "Bukan cuma SEO \u2014 optimasi untuk Google,", fill=ACCENT, font=R32)
    draw.text((M, 805), "ChatGPT, Gemini, Perplexity & AI lainnya", fill=ACCENT, font=R32)
    
    # Footer
    draw.text((M, H-55), "studiosoft.id", fill=ACCENT, font=R20)
    draw.text((W-M, H-55), "#GEO #SearchEverywhere", fill=ACCENT, font=R20, anchor="ra")
    
    f = f"{OUT_DIR}/01_cover.jpg"
    img.save(f, quality=85)
    print(f"✅ 01_cover.jpg")
    return f

# ════════ SLIDE 2 — APA ITU GEO ════════
def s2():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    
    draw.text((M, M), "StudioSoft", fill=ACCENT, font=B24)
    draw.text((W-M, M), "2/5", fill=ACCENT, font=B24, anchor="ra")
    
    draw.text((M, 120), "Apa Itu GEO?", fill=WHITE, font=B80)
    draw.rectangle([(M, 200), (W-M, 202)], fill=ACCENT)
    
    y = 250
    items = [
        ("01", "Optimasi untuk AI", "Strategi optimasi konten biar brand &\nwebsite muncul sebagai referensi di jawaban\nAI seperti ChatGPT, Gemini, Perplexity."),
        ("02", "Bukan SEO Biasa", "SEO fokus ranking di 10 link biru Google.\nGEO fokus bagaimana AI memahami, memilih,\ndan mengutip kontenmu."),
        ("03", "Kenapa Berbeda?", "AI nggak nampilin link \u2014 AI nyusun jawaban\ndari berbagai sumber biar kontenmu layak\njadi referensi."),
    ]
    
    for num, title, desc in items:
        draw.text((M, y), num, fill=WHITE, font=B55)
        draw.text((M+65, y), title, fill=WHITE, font=SB45)
        y += 55
        lines = wp(draw, desc, R32, MX-65)
        for lt, lf in lines:
            draw.text((M+65, y), lt, fill=ACCENT, font=lf)
            y += lf.size + 4
        y += 25
    
    draw.text((M, H-55), "studiosoft.id", fill=ACCENT, font=R20)
    draw.text((W-M, H-55), "#GEO", fill=ACCENT, font=R20, anchor="ra")
    
    f = f"{OUT_DIR}/02_slide.jpg"
    img.save(f, quality=85)
    print(f"✅ 02_slide.jpg")
    return f

# ════════ SLIDE 3 — DATA ════════
def s3():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    
    draw.text((M, M), "StudioSoft", fill=ACCENT, font=B24)
    draw.text((W-M, M), "3/5", fill=ACCENT, font=B24, anchor="ra")
    
    draw.text((M, 120), "Kenapa GEO Penting?", fill=WHITE, font=B70)
    draw.rectangle([(M, 195), (W-M, 197)], fill=ACCENT)
    draw.text((M, 230), "Data yang Wajib Kamu Tahu", fill=ACCENT, font=SB40)
    
    # 2x2 data cards
    cw = (MX - 25) // 2
    
    data = [
        ("73%", "search intent masih\ndi Google", "SparkToro"),
        ("27%", "tersebar di 40+\nplatform lain", "ChatGPT, YouTube,\nReddit, TikTok, dll"),
        ("800%", "kenaikan referral AI/\nLLM dalam 3 bulan", "Backlinko"),
        ("6,5x", "AI lebih sering mengutip\nbrand dari pihak ke-3", "Kevin Indig"),
    ]
    
    for i, (num, label, src) in enumerate(data):
        col = i % 2
        row = i // 2
        cx = M + col * (cw + 25)
        cy = 300 + row * 195
        
        draw.rounded_rectangle([(cx, cy), (cx+cw, cy+175)], radius=10, fill="#152D5A")
        draw.text((cx+15, cy+12), num, fill=WHITE, font=B70)
        lines = wp(draw, label, R28, cw-30)
        ly = cy + 85
        for lt, lf in lines:
            draw.text((cx+15, ly), lt, fill=ACCENT, font=lf)
            ly += lf.size + 3
        draw.text((cx+15, cy+155), src, fill=ACCENT, font=R20)
    
    # Bottom
    draw.rectangle([(M, 720), (W-M, 722)], fill=ACCENT)
    draw.text((M, 760), "Ini bukan tren \u2014 ini perubahan fundamental", fill=WHITE, font=B45)
    draw.text((M, 820), "cara orang mencari informasi.", fill=WHITE, font=B45)
    
    draw.text((M, H-55), "studiosoft.id", fill=ACCENT, font=R20)
    draw.text((W-M, H-55), "#GEO #SEO", fill=ACCENT, font=R20, anchor="ra")
    
    f = f"{OUT_DIR}/03_slide.jpg"
    img.save(f, quality=85)
    print(f"✅ 03_slide.jpg")
    return f

# ════════ SLIDE 4 — SEO vs GEO ════════
def s4():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    
    draw.text((M, M), "StudioSoft", fill=ACCENT, font=B24)
    draw.text((W-M, M), "4/5", fill=ACCENT, font=B24, anchor="ra")
    
    draw.text((M, 120), "SEO vs GEO", fill=WHITE, font=B70)
    draw.rectangle([(M, 195), (W-M, 197)], fill=ACCENT)
    draw.text((M, 230), "Pahami Bedanya, Kuasai Dua-duanya", fill=ACCENT, font=SB40)
    
    cw = (MX - 25) // 2
    ch = 320
    
    # SEO box
    draw.rounded_rectangle([(M, 290), (M+cw, 290+ch)], radius=12, fill="#152D5A")
    draw.text((M+20, 310), "SEO", fill=WHITE, font=B55)
    seo = ["Keyword & Backlink", "Ranking Google SERP", "10 Link Biru Klasik", "Traffic dari Klik", "Algoritma Google"]
    iy = 385
    for it in seo:
        draw.ellipse([(M+20, iy+5), (M+36, iy+21)], fill=ACCENT)
        draw.text((M+48, iy), it, fill=ACCENT, font=R28)
        iy += 38
    
    # GEO box
    cx2 = M + cw + 25
    draw.rounded_rectangle([(cx2, 290), (cx2+cw, 290+ch)], radius=12, fill="#152D5A")
    draw.text((cx2+20, 310), "GEO", fill=WHITE, font=B55)
    geo = ["Konten Informatif", "Disebut Jawaban AI", "Semua Platform", "Traffic dari AI Chat", "Relevansi & Otoritas"]
    iy = 385
    for it in geo:
        draw.ellipse([(cx2+20, iy+5), (cx2+36, iy+21)], fill=ACCENT)
        draw.text((cx2+48, iy), it, fill=ACCENT, font=R28)
        iy += 38
    
    # Conclusion
    draw.rectangle([(M, 660), (W-M, 662)], fill=ACCENT)
    draw.text((M, 700), "Keduanya saling melengkapi.", fill=WHITE, font=B50)
    draw.text((M, 760), "Jangan pilih salah satu \u2014 kuasai dua-duanya.", fill=ACCENT, font=SB40)
    
    # Quote
    draw.text((M, 870), "\u201cSEO dulu soal ranking. Sekarang soal", fill=ACCENT, font=R28)
    draw.text((M, 910), "relevance dan trust di tiap platform.\u201d", fill=ACCENT, font=R28)
    draw.text((M, 950), "\u2014 Neil Patel", fill=ACCENT, font=SB36)
    
    draw.text((M, H-55), "studiosoft.id", fill=ACCENT, font=R20)
    draw.text((W-M, H-55), "#SEO #GEO", fill=ACCENT, font=R20, anchor="ra")
    
    f = f"{OUT_DIR}/04_slide.jpg"
    img.save(f, quality=85)
    print(f"✅ 04_slide.jpg")
    return f

# ════════ SLIDE 5 — CTA ════════
def s5():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    
    draw.text((M, M), "StudioSoft", fill=ACCENT, font=B24)
    draw.text((W-M, M), "5/5", fill=ACCENT, font=B24, anchor="ra")
    
    draw.text((M, 120), "Siap Mulai GEO?", fill=WHITE, font=B70)
    draw.rectangle([(M, 195), (W-M, 197)], fill=ACCENT)
    draw.text((M, 230), "3 Langkah Awal", fill=ACCENT, font=SB40)
    
    steps = [
        ("01", "Audit", "Di mana audiensmu mencari informasi?"),
        ("02", "Optimasi", "Website, GBP, sosmed, YouTube \u2014 rapikan semua."),
        ("03", "Otoritas", "Guest post, ulasan, publikasi industri. AI suka ini."),
    ]
    
    y = 300
    for num, title, desc in steps:
        draw.rounded_rectangle([(M, y), (W-M, y+90)], radius=8, fill="#152D5A")
        draw.text((M+20, y+12), num, fill=WHITE, font=B50)
        draw.text((M+85, y+10), title, fill=WHITE, font=SB45)
        draw.text((M+85, y+55), desc, fill=ACCENT, font=R28)
        y += 110
    
    y += 5
    draw.rectangle([(M, y), (W-M, y+2)], fill=ACCENT)
    y += 20
    draw.text((M, y), "Yang adaptasi sekarang,", fill=WHITE, font=B60)
    draw.text((M, y+70), "yang menang di 2027.", fill=WHITE, font=B60)
    
    # CTA
    y_cta = H - 130
    draw.rounded_rectangle([(M, y_cta), (W-M, y_cta+55)], radius=10, fill=ACCENT)
    draw.text((W//2, y_cta+28), "Konsultasi GRATIS \u2192 0819-3500-0624", fill=BLUE, font=SB36, anchor="mm")
    
    draw.text((M, H-55), "studiosoft.id", fill=ACCENT, font=R20)
    draw.text((W-M, H-55), "#StudioSoft #GEO", fill=ACCENT, font=R20, anchor="ra")
    
    f = f"{OUT_DIR}/05_slide.jpg"
    img.save(f, quality=85)
    print(f"✅ 05_slide.jpg")
    return f

# ════════════ GENERATE ════════════
print("=" * 50)
print("GEO CAROUSEL — 4:5 (referensi Bos)")
print("=" * 50)
s1(); s2(); s3(); s4(); s5()
print("\n✅ Semua slide selesai!")

# ════════════ SCHEDULE ════════════
SLOT = "2026-07-25T13:00:00.000Z"
FILES = sorted([f for f in os.listdir(OUT_DIR) if f.endswith('.jpg')])
ACCOUNT = "6a335b9ec5ff4ce3a3225c2a"

def api_call(method, endpoint, data=None):
    url = f"{BASE_URL}{endpoint}"
    body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(url, data=body, headers=HEADERS, method=method)
    try:
        with urllib.request.urlopen(req) as resp:
            raw = resp.read()
            return json.loads(raw) if raw else {"success": True}
    except urllib.error.HTTPError as e:
        raw = e.read().decode()
        return {"error": e.code, "body": json.loads(raw) if raw.startswith('{') else raw[:500]}

# Hapus jadwal lama
print("\n⏳ Membersihkan jadwal lama...")
# Jadwal lama yg udah ditrack:
for sid in ['6a64a03089636db5d5de2358', '6a64a08e89636db5d5de3a2e', '6a64a40828aac9bb5bd19494', '6a64a4b228aac9bb5bd1b784']:
    r = api_call("DELETE", f"/public/schedule/{sid}")
    if 'error' in r:
        print(f"  {sid}: {r.get('error')} (maybe already deleted)")
    else:
        print(f"  {sid}: deleted")

medias = []
for fname in sorted(FILES):
    with open(os.path.join(OUT_DIR, fname), "rb") as f:
        b64 = base64.b64encode(f.read()).decode()
    medias.append({"url": f"data:image/jpeg;base64,{b64}", "type": "image", "alt": "GEO StudioSoft"})

caption = (
    "GEO (Generative Engine Optimization) adalah strategi baru "
    "yang nggak bisa diabaikan di 2026.\n\n"
    "SEO bikin brandmu ranking di Google. GEO bikin "
    "brandmu disebut di jawaban AI \u2014 ChatGPT, Gemini, "
    "Perplexity, dan Google AI Overviews.\n\n"
    "Yang nggak siap sekarang, bakal ketinggalan.\n\n"
    "Slide by StudioSoft"
    "\nstudiosoft.id"
)

replies = [
    "SEO vs GEO:\n"
    "SEO = ranking keyword + backlink\n"
    "GEO = konten informatif + disebut AI\n\n"
    "Keduanya penting. Tapi ke depannya, "
    "AI makin jadi gerbang pertama konsumen.",

    "3 Langkah Awal:\n"
    "1. Audit \u2014 di mana audiens cari info?\n"
    "2. Optimasi platform (web, GBP, sosmed)\n"
    "3. Bangun otoritas (publikasi industri)\n\n"
    "Yang adaptasi sekarang, yang menang di 2027.\nstudiosoft.id",
]

payload = {
    "title": "", "description": caption,
    "topic": "GEO, Generative Engine Optimization",
    "type": "album", "medias": medias,
    "meta": {"title": "", "description": "", "url": ""},
    "additionalInfo": {"isAiGenerated": False, "isDraft": False,
        "collaborators": [], "mentions": [],
        "music": {"id":"","artist":"","name":"","thumbnail":""},
        "products": [], "tags": []},
    "replies": [{"text": r, "username": ""} for r in replies],
    "accountId": ACCOUNT, "scheduleAt": SLOT,
}

print("\n" + "=" * 50)
print("SCHEDULING TO STUDIOSOFT THREADS")
print(f"Slot: {SLOT} (20:00 WIB)")
print(f"File: {len(FILES)} slide (4:5)")
print("=" * 50)

r = api_call("POST", "/public/schedule", payload)
if "error" in r:
    print(f"ERROR: {r['error']} - {r.get('body','')}")
else:
    print(f"SUCCESS! Schedule ID: {r.get('scheduleId','?')}")

print("\nDONE")
