#!/usr/bin/env python3
"""GEO Carousel StudioSoft — gaya DMark referensi (minimal, flat, bold typography)."""
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_ref"
os.makedirs(OUT_DIR, exist_ok=True)

W, H = 1080, 1920
M = 65
MX = W - 2*M

BLUE = "#1E40AF"
WHITE = "#FFFFFF"
ACCENT = "#DBEAFE"      # light blue accent   
DARK = "#1E3A5F"        # slightly darker for cards
GOLD = "#FCD34D"        # gold accent sparingly

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

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

# Font sizes - clean hierarchy
B160 = ft("Bold", 160)
B120 = ft("Bold", 120)
B100 = ft("Bold", 100)
B90  = ft("Bold", 90)
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)
SB50 = ft("SemiBold", 50)
SB45 = ft("SemiBold", 45)
SB40 = ft("SemiBold", 40)
SB36 = ft("SemiBold", 36)
SB32 = ft("SemiBold", 32)
R45  = ft("Regular", 45)
R40  = ft("Regular", 40)
R38  = ft("Regular", 38)
R36  = ft("Regular", 36)
R34  = ft("Regular", 34)
R32  = ft("Regular", 32)
R28  = ft("Regular", 28)
R24  = ft("Regular", 24)
R20  = ft("Regular", 20)

def wp(d, tx, fn, mw):
    """Wrap text."""
    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

def hf(draw, num, total=5, cover=False):
    """Header & footer."""
    draw.text((M, 35), "StudioSoft", fill=ACCENT, font=R24)
    if not cover:
        draw.text((W-M, 35), f"{num}/{total}", fill=ACCENT, font=R24, anchor="ra")
    draw.text((M, H-45), "studiosoft.id", fill=ACCENT, font=R24)

def accent_line(draw, y):
    """Thin accent divider."""
    draw.rectangle([(M, y), (W-M, y+2)], fill=ACCENT)

# ════════════ SLIDE 1 — COVER ════════════
def s1():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    hf(draw, 1, cover=True)
    
    # Hero text
    draw.text((M, 300), "GEO", fill=WHITE, font=B100)
    draw.text((M, 420), "Generative Engine", fill=ACCENT, font=SB50)
    draw.text((M, 480), "Optimization", fill=ACCENT, font=SB50)
    
    accent_line(draw, 560)
    
    draw.text((M, 630), "Strategi Baru Biar Brandmu", fill=WHITE, font=B60)
    draw.text((M, 705), "Disebut di Jawaban AI", fill=WHITE, font=B60)
    
    draw.text((M, 850), "Bukan cuma SEO \u2014 optimasi untuk Google,", fill=ACCENT, font=R36)
    draw.text((M, 895), "ChatGPT, Gemini, Perplexity & AI lainnya", fill=ACCENT, font=R36)
    
    # Bottom section
    accent_line(draw, 1150)
    
    draw.text((M, 1200), "StudioSoft", fill=WHITE, font=B60)
    draw.text((M, 1280), "Partner Pertumbuhan Bisnis Berbasis Data", fill=ACCENT, font=R32)
    
    draw.rounded_rectangle([(M, 1400), (W-M, 1460)], radius=8, fill=DARK)
    draw.text((W//2, 1430), "studiosoft.id", fill=ACCENT, font=SB36, anchor="mm")
    
    f = f"{OUT_DIR}/01_cover.jpg"
    img.save(f, quality=82)
    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)
    hf(draw, 2)
    
    draw.text((M, 120), "Apa Itu GEO?", fill=WHITE, font=B80)
    accent_line(draw, 220)
    draw.text((M, 260), "Generative Engine Optimization adalah strategi optimasi\nkonten biar brand dan websitemu muncul sebagai\nreferensi di jawaban AI.", fill=ACCENT, font=R38)
    
    # Card 1
    y = 460
    draw.rounded_rectangle([(M, y), (W-M, y+140)], radius=12, fill=DARK)
    draw.text((M+25, y+20), "01", fill=GOLD, font=B55)
    draw.text((M+100, y+15), "Optimasi untuk AI", fill=WHITE, font=SB45)
    draw.text((M+100, y+75), "ChatGPT, Gemini, Perplexity, Google AI Overviews", fill=ACCENT, font=R32)
    
    # Card 2
    y = 630
    draw.rounded_rectangle([(M, y), (W-M, y+140)], radius=12, fill=DARK)
    draw.text((M+25, y+20), "02", fill=GOLD, font=B55)
    draw.text((M+100, y+15), "Bukan SEO Biasa", fill=WHITE, font=SB45)
    draw.text((M+100, y+75), "SEO: ranking di 10 link biru. GEO: bagaimana AI", fill=ACCENT, font=R32)
    draw.text((M+100, y+110), "memahami, memilih, dan mengutip kontenmu.", fill=ACCENT, font=R32)
    
    # Card 3
    y = 800
    draw.rounded_rectangle([(M, y), (W-M, y+140)], radius=12, fill=DARK)
    draw.text((M+25, y+20), "03", fill=GOLD, font=B55)
    draw.text((M+100, y+15), "Kenapa Berbeda?", fill=WHITE, font=SB45)
    draw.text((M+100, y+75), "AI nggak nampilin link \u2014 AI nyusun jawaban dari", fill=ACCENT, font=R32)
    draw.text((M+100, y+110), "berbagai sumber. Kontenmu harus layak jadi referensi.", fill=ACCENT, font=R32)
    
    f = f"{OUT_DIR}/02_slide.jpg"
    img.save(f, quality=82)
    print(f"✅ 02_slide.jpg")
    return f

# ════════ SLIDE 3 — DATA ════════
def s3():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    hf(draw, 3)
    
    draw.text((M, 120), "Kenapa GEO Penting?", fill=WHITE, font=B80)
    accent_line(draw, 220)
    draw.text((M, 260), "Data yang Wajib Kamu Tahu", fill=ACCENT, font=SB45)
    
    # 2x2 data grid
    cw = (MX - 30) // 2
    ch = 210
    
    items = [
        ("73%", "search intent masih\ndi Google", "SparkToro, 2025"),
        ("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(items):
        col = i % 2
        row = i // 2
        cx = M + col * (cw + 30)
        cy = 350 + row * (ch + 30)
        
        draw.rounded_rectangle([(cx, cy), (cx+cw, cy+ch)], radius=12, fill=DARK)
        draw.text((cx+20, cy+15), num, fill=GOLD, font=B70)
        
        lines = wp(draw, label, R32, cw-40)
        ly = cy + 90
        for lt, lf in lines:
            draw.text((cx+20, ly), lt, fill=WHITE, font=lf)
            ly += lf.size + 4
        
        draw.text((cx+20, cy+ch-30), src, fill=ACCENT, font=R24)
    
    # Bottom takeaway
    accent_line(draw, 1070)
    draw.text((M, 1110), "Ini bukan tren \u2014 ini perubahan fundamental", fill=WHITE, font=B50)
    draw.text((M, 1180), "cara orang mencari informasi.", fill=WHITE, font=B50)
    
    f = f"{OUT_DIR}/03_slide.jpg"
    img.save(f, quality=82)
    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)
    hf(draw, 4)
    
    draw.text((M, 120), "SEO vs GEO", fill=WHITE, font=B80)
    accent_line(draw, 220)
    draw.text((M, 260), "Pahami Bedanya, Kuasai Dua-duanya", fill=ACCENT, font=SB45)
    
    cw = (MX - 30) // 2
    
    # SEO box
    cx = M
    draw.rounded_rectangle([(cx, 350), (cx+cw, 720)], radius=15, fill=DARK)
    draw.text((cx+25, 375), "SEO", fill=GOLD, font=B55)
    seo_items = [
        "Keyword & Backlink",
        "Ranking Google SERP",
        "10 Link Biru Klasik",
        "Traffic dari Klik",
        "Algoritma Google",
    ]
    iy = 445
    for it in seo_items:
        draw.ellipse([(cx+25, iy+6), (cx+41, iy+22)], fill=GOLD)
        draw.text((cx+55, iy), it, fill=ACCENT, font=R32)
        iy += 42
    
    # GEO box
    cx2 = M + cw + 30
    draw.rounded_rectangle([(cx2, 350), (cx2+cw, 720)], radius=15, fill=DARK)
    draw.text((cx2+25, 375), "GEO", fill=GOLD, font=B55)
    geo_items = [
        "Konten Informatif",
        "Disebut Jawaban AI",
        "Semua Platform",
        "Traffic dari AI Chat",
        "Relevansi & Otoritas",
    ]
    iy = 445
    for it in geo_items:
        draw.ellipse([(cx2+25, iy+6), (cx2+41, iy+22)], fill=GOLD)
        draw.text((cx2+55, iy), it, fill=ACCENT, font=R32)
        iy += 42
    
    # Conclusion
    accent_line(draw, 780)
    draw.text((M, 830), "Keduanya saling melengkapi.", fill=WHITE, font=B55)
    draw.text((M, 900), "Jangan pilih salah satu \u2014 kuasai dua-duanya.", fill=ACCENT, font=SB45)
    
    # Quote
    draw.text((M, 1030), "\u201cSEO dulu soal ranking.", fill=ACCENT, font=R36)
    draw.text((M, 1080), "Sekarang soal relevance dan trust", fill=ACCENT, font=R36)
    draw.text((M, 1130), "di tiap platform.\u201d", fill=ACCENT, font=R36)
    draw.text((M, 1190), "\u2014 Neil Patel", fill=ACCENT, font=SB36)
    
    f = f"{OUT_DIR}/04_slide.jpg"
    img.save(f, quality=82)
    print(f"✅ 04_slide.jpg")
    return f

# ════════ SLIDE 5 — CTA ════════
def s5():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    hf(draw, 5)
    
    draw.text((M, 120), "Siap Mulai GEO?", fill=WHITE, font=B80)
    accent_line(draw, 220)
    draw.text((M, 260), "3 Langkah Awal", fill=ACCENT, font=SB45)
    
    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 = 370
    for num, title, desc in steps:
        draw.rounded_rectangle([(M, y), (W-M, y+120)], radius=12, fill=DARK)
        draw.text((M+25, y+20), num, fill=GOLD, font=B55)
        draw.text((M+110, y+18), title, fill=WHITE, font=SB45)
        draw.text((M+110, y+75), desc, fill=ACCENT, font=R34)
        y += 145
    
    # Bold closing
    y += 10
    accent_line(draw, y)
    y += 30
    draw.text((M, y), "Yang adaptasi sekarang,", fill=WHITE, font=B70)
    draw.text((M, y+80), "yang menang di 2027.", fill=WHITE, font=B70)
    
    # CTA
    y_cta = H - 180
    draw.rounded_rectangle([(M, y_cta), (W-M, y_cta+65)], radius=12, fill=ACCENT)
    draw.text((W//2, y_cta+33), "Konsultasi GRATIS \u2192 0819-3500-0624", fill=BLUE, font=SB40, anchor="mm")
    
    f = f"{OUT_DIR}/05_slide.jpg"
    img.save(f, quality=82)
    print(f"✅ 05_slide.jpg")
    return f

# ════════════ GENERATE ════════════
print("=" * 50)
print("GENERATING GEO CAROUSEL (ref style)")
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 semua jadwal hari ini
print("\n⏳ Membersihkan jadwal lama...")
r = api_call("GET", f"/public/schedule?accountId={ACCOUNT}&limit=50")
for item in r.get('items', []):
    sid = item.get('id','')
    if sid:
        api_call("DELETE", f"/public/schedule/{sid}")

medias = []
for fname in sorted(FILES):
    fpath = os.path.join(OUT_DIR, fname)
    with open(fpath, "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("=" * 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")
