#!/usr/bin/env python3
"""Generate & schedule GEO carousel BG BIRU for StudioSoft Threads.
Resolusi: 1080×1920 (9:16 portrait) — aturan fixed.
Format: JPG.
"""
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_bg_biru"
os.makedirs(OUT_DIR, exist_ok=True)

# ── ATURAN FIX ──
W, H = 1080, 1920          # 9:16 portrait
MARGIN = 65
MAX_W = W - 2 * MARGIN
BLUE = "#1E40AF"
WHITE = "#FFFFFF"
ACCENT = "#DBEAFE"

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

def get_font(name, size):
    return ImageFont.truetype(os.path.join(FONT_DIR, f"Poppins-{name}.ttf"), size)

# Font sizes
B110 = get_font("Bold", 110)
B100 = get_font("Bold", 100)
B90  = get_font("Bold", 90)
B80  = get_font("Bold", 80)
B70  = get_font("Bold", 70)
B60  = get_font("Bold", 60)
SB55 = get_font("SemiBold", 55)
SB45 = get_font("SemiBold", 45)
SB40 = get_font("SemiBold", 40)
R40  = get_font("Regular", 40)
R36  = get_font("Regular", 36)
R32  = get_font("Regular", 32)
R28  = get_font("Regular", 28)
R24  = get_font("Regular", 24)

def wrap_lines(draw, text, font, max_w):
    lines = []
    for para in text.split('\n'):
        if not para.strip():
            lines.append(('', font))
            continue
        words = para.split()
        cur = ""
        for w in words:
            test = cur + w + " "
            if draw.textlength(test, font=font) <= max_w:
                cur = test
            else:
                if cur:
                    lines.append((cur.rstrip(), font))
                cur = w + " "
        if cur.strip():
            lines.append((cur.rstrip(), font))
    return lines

def header_footer(draw, num, total=5, cover=False):
    draw.text((MARGIN, 30), "StudioSoft", fill=WHITE, font=R28)
    if not cover:
        draw.text((W - MARGIN, 30), f"{num}/{total}", fill=ACCENT, font=R28, anchor="ra")
    draw.text((MARGIN, H - 50), "studiosoft.id", fill=ACCENT, font=R28)
    draw.text((W - MARGIN, H - 50), "#GEO #SearchEverywhere", fill=ACCENT, font=R28, anchor="ra")

def slide(num, content_blocks, cover=False):
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    header_footer(draw, num, cover=cover)

    y = 130 if not cover else 380
    for text, font_ov in content_blocks:
        font = font_ov if font_ov else R36
        lines = wrap_lines(draw, text, font, MAX_W)
        for lt, lf in lines:
            if lt:
                draw.text((MARGIN, y), lt, fill=WHITE, font=lf)
                y += lf.size + 8
        y += 10

    fname = f"{num:02d}_{'cover' if cover else 'slide'}.jpg"
    img.save(os.path.join(OUT_DIR, fname), quality=80)
    print(f"✅ {fname} | {os.path.getsize(os.path.join(OUT_DIR, fname))/1024:.0f}KB")
    return os.path.join(OUT_DIR, fname)

# ═══════════════════════════
#  SLIDE 1 — COVER
# ═══════════════════════════
slide(1, [
    ("GEO: Generative\nEngine\nOptimization", B110),
    ("", None),
    ("Strategi Baru Biar Brandmu", SB55),
    ("Disebut di Jawaban AI", SB55),
    ("", None),
    ("", None),
    ("", None),
    ("StudioSoft \u2022 Partner Pertumbuhan Bisnis Berbasis Data", R32),
], cover=True)

# ═══════════════════════════
#  SLIDE 2 — Apa Itu GEO
# ═══════════════════════════
slide(2, [
    ("Apa Itu GEO?", B90),
    ("", None),
    ("GEO (Generative Engine Optimization) adalah strategi\noptimasi konten biar brand dan websitemu muncul\nsebagai referensi di jawaban AI seperti ChatGPT,\nGemini, Perplexity, dan Google AI Overviews.", R36),
    ("", None),
    ("Berbeda dari SEO yang fokus ranking di 10 link biru,\nGEO fokus pada bagaimana AI memahami, memilih,\ndan mengutip kontenmu.", R36),
    ("", None),
    ("\u2022  SEO \u2192 Ranking di Google", R36),
    ("\u2022  GEO \u2192 Disebut di Jawaban AI", R36),
])

# ═══════════════════════════
#  SLIDE 3 — Kenapa GEO Penting
# ═══════════════════════════
slide(3, [
    ("Kenapa GEO Penting?", B90),
    ("", None),
    ("\u2022  73% search intent masih di Google\n   (SparkToro, 2025)", R36),
    ("", None),
    ("\u2022  27% sisanya tersebar di 40+ platform:\n   ChatGPT, YouTube, Reddit, TikTok, Amazon", R36),
    ("", None),
    ("\u2022  Referral dari AI/LLM naik 800%\n   dalam 3 bulan (Backlinko)", R36),
    ("", None),
    ("\u2022  AI 6,5x lebih sering mengutip brand\n   dari sumber pihak ketiga (Kevin Indig)", R36),
    ("", None),
    ("Data ini bukan tren \u2014 ini perubahan\nfundamental cara orang mencari informasi.", SB45),
])

# ═══════════════════════════
#  SLIDE 4 — SEO vs GEO
# ═══════════════════════════
slide(4, [
    ("SEO vs GEO", B90),
    ("", None),
    ("SEO", B80),
    ("Keyword + backlink + ranking", R36),
    ("Google SERP", R36),
    ("", None),
    ("GEO", B80),
    ("Konten informatif + otoritas", R36),
    ("Pihak ketiga + disebut AI", R36),
    ("", None),
    ("Keduanya saling melengkapi.\nJangan pilih salah satu \u2014 kuasai dua-duanya.", SB55),
    ("", None),
    ("\u201cSEO dulu soal ranking. Sekarang soal\nrelevance dan trust di tiap platform.\u201d", R32),
    ("\u2014 Neil Patel", R32),
])

# ═══════════════════════════
#  SLIDE 5 — CTA
# ═══════════════════════════
slide(5, [
    ("Siap Mulai GEO?", B90),
    ("", None),
    ("3 Langkah Awal:", SB55),
    ("", None),
    ("1. Audit \u2014 di mana audiensmu", R36),
    ("   mencari informasi?", R36),
    ("", None),
    ("2. Optimasi platform \u2014 website,", R36),
    ("   GBP, sosmed, YouTube", R36),
    ("", None),
    ("3. Bangun otoritas \u2014 guest post,", R36),
    ("   ulasan, publikasi industri", R36),
    ("", None),
    ("Yang adaptasi sekarang,", B80),
    ("yang menang di 2027.", B80),
    ("", None),
    ("Konsultasi GRATIS \u2192", SB45),
    ("wa.me/6281935000624", SB45),
])

print(f"\nSemua slide tersimpan di {OUT_DIR}/")

# ═══════════════════════════
#  SCHEDULE TO STUDIOSOFT THREADS
# ═══════════════════════════
SLOT = "2026-07-25T13:00:00.000Z"  # 20:00 WIB
FILES = sorted(os.listdir(OUT_DIR))
ACCOUNT = "6a335b9ec5ff4ce3a3225c2a"  # StudioSoft Threads

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()
            if resp.status == 204:
                return {"success": True}
            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]}

# Delete old schedule first
print("\n⏳ Menghapus jadwal lama...")
del_res = api_call("DELETE", f"/public/schedule/6a6498e189636db5d5dc4c99")
if "error" in del_res:
    print(f"  Hapus lama: {del_res.get('error')} - {del_res.get('body','')}")
else:
    print("  ✅ Jadwal lama dihapus")

medias = []
for fname in 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 Generative Engine Optimization StudioSoft",
    })

caption = (
    "GEO (Generative Engine Optimization) adalah strategi baru "
    "yang nggak bisa diabaikan di 2026.\n\n"
    "Sementara SEO bikin brandmu ranking di Google, GEO bikin "
    "brandmu disebut di jawaban AI \u2014 ChatGPT, Gemini, "
    "Perplexity, dan Google AI Overviews.\n\n"
    "Data terbaru: referral dari AI/LLM naik 800% dalam 3 bulan saja. "
    "Yang nggak siap, bakal kehilangan traffic besar.\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 sering jadi pintu gerbang pertama konsumen "
    "sebelum ke website.",

    "3 Langkah Awal:\n"
    "1. Audit \u2014 di mana audiens cari info?\n"
    "2. Optimasi managed (website, GBP, sosmed)\n"
    "3. Bangun influenced (review, publikasi industri)\n\n"
    "Yang adaptasi sekarang, yang menang di 2027.\n\n"
    "studiosoft.id",
]

payload = {
    "title": "",
    "description": caption,
    "topic": "GEO, Generative Engine Optimization, SEO",
    "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" + "=" * 60)
print("SCHEDULING TO STUDIOSOFT THREADS")
print(f"Slot: {SLOT} (20:00 WIB)")
print(f"File: {len(FILES)} slide")
print("=" * 60)

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")
