#!/usr/bin/env python3
"""
StudioSoft — Growth Theory Ep.01 "Evolusi SEO"
Konsep ala TORCH "Bag Theory": storytelling series edukasi
1080x1350 (4:5) • BG Biru #1E40AF • template studiosoft_bg_biru.py
"""

from PIL import Image, ImageDraw, ImageFont
import os

OUT = os.path.expanduser("~/.openclaw/workspace-atun/studiosoft_growth_theory")
os.makedirs(OUT, exist_ok=True)

W, H = 1080, 1350
BG = (30, 64, 175)
WHITE = (255, 255, 255)
SOFT = (200, 216, 255)
M = 50
CONTENT_W = W - 2 * M  # 980

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

J100 = ImageFont.truetype(f"{FD}/Poppins-Bold.ttf", 100)
B36 = ImageFont.truetype(f"{FD}/Poppins-Bold.ttf", 36)
B28 = ImageFont.truetype(f"{FD}/Poppins-Bold.ttf", 28)
R28 = ImageFont.truetype(f"{FD}/Poppins-Regular.ttf", 28)
R22 = ImageFont.truetype(f"{FD}/Poppins-Regular.ttf", 22)
R20 = ImageFont.truetype(f"{FD}/Poppins-Regular.ttf", 20)


def fw(d, text, font):
    return d.textbbox((0, 0), text, font=font)[2]


def fh(d, text, font):
    b = d.textbbox((0, 0), text, font=font)
    return b[3] - b[1]


def wrap(d, text, font, mx):
    lines = []
    for p in text.split("\n"):
        ws = p.split()
        cur = ""
        for w in ws:
            t = (cur + " " + w) if cur else w
            if fw(d, t, font) > mx and cur:
                lines.append(cur)
                cur = w
            else:
                cur = t
        if cur:
            lines.append(cur)
    return lines


def block_h(d, content, font, mx, ls=1.35):
    total = 0
    for line in wrap(d, content, font, mx):
        lh = fh(d, line, font)
        total += int(lh * ls)
    return total


def draw_block(d, text, x, y, font, fill, mx, ls=1.35):
    for line in wrap(d, text, font, mx):
        lh = fh(d, line, font)
        d.text((x, y), line, font=font, fill=fill)
        y += int(lh * ls)
    return y


def header(d, page):
    d.text((M, M), "STUDIOSOFT", font=B36, fill=WHITE)
    d.text((W - M, M), page, font=R22, fill=WHITE, anchor="rt")


def divider(d, x, y, w=300):
    dx = x
    while dx < x + w:
        e = min(dx + 14, x + w)
        d.line([(dx, y), (e, y)], fill=WHITE, width=2)
        dx += 24


def footer(d, left="www.studiosoft.id", right=""):
    d.text((M, H - 130), left, font=R20, fill=WHITE)
    if right:
        d.text((W - M, H - 130), right, font=R20, fill=WHITE, anchor="rt")


def clean_edges(im):
    px = im.load()
    for y in range(H):
        for x in range(3):
            px[x, y] = BG
        for x in range(W - 3, W):
            px[x, y] = BG
    for y in range(H - 5, H):
        for x in range(W):
            px[x, y] = BG
    for x in range(W):
        for y in range(3):
            px[x, y] = BG


def render_cover():
    im = Image.new("RGB", (W, H), BG)
    d = ImageDraw.Draw(im)
    header(d, "01/04")

    total_h = 0
    for t in ["GROWTH", "THEORY"]:
        total_h += int(fh(d, t, J100) * 1.15)
    total_h += 60 + 5 + 55  # divider gap
    ep_h = fh(d, "Ep.01  —  Evolusi SEO", B36)
    total_h += ep_h + 40
    desc = "Cerita di balik cara orang\nmenemukan bisnis di internet."
    total_h += block_h(d, desc, R28, CONTENT_W)

    hdr_h = fh(d, "STUDIOSOFT", B36)
    usable = H - 2 * M - hdr_h - 20
    start_y = M + hdr_h + 20 + (usable - total_h) // 2

    ty = start_y
    for t in ["GROWTH", "THEORY"]:
        d.text((M, ty), t, font=J100, fill=WHITE)
        ty += int(fh(d, t, J100) * 1.15)

    ty += 30
    divider(d, M, ty, 300)
    ty += 25 + 15

    d.text((M, ty), "Ep.01  —  Evolusi SEO", font=B36, fill=WHITE)
    ty += ep_h + 40

    draw_block(d, desc, M, ty, R28, SOFT, CONTENT_W)

    footer(d, "www.studiosoft.id", "Swipe →")
    clean_edges(im)
    im.save(f"{OUT}/01_cover.jpg", quality=88)
    print("✅ 01_cover.jpg")


def render_content(page, num, title_lines, body):
    im = Image.new("RGB", (W, H), BG)
    d = ImageDraw.Draw(im)
    header(d, page)

    total_h = 0
    for t in title_lines:
        total_h += int(fh(d, t, J100) * 1.15)
    total_h += 60 + 5 + 55  # divider gap
    total_h += block_h(d, body, R28, CONTENT_W)

    hdr_h = fh(d, "STUDIOSOFT", B36)
    usable = H - 2 * M - hdr_h - 20
    start_y = M + hdr_h + 20 + (usable - total_h) // 2

    ty = start_y
    for t in title_lines:
        d.text((M, ty), t, font=J100, fill=WHITE)
        ty += int(fh(d, t, J100) * 1.15)

    ty += 30
    divider(d, M, ty, 300)
    ty += 25

    draw_block(d, body, M, ty, R28, WHITE, CONTENT_W)
    footer(d, "www.studiosoft.id")
    clean_edges(im)
    im.save(f"{OUT}/{num}.jpg", quality=88)
    print(f"✅ {num}.jpg")


# ============ SLIDE 1 — COVER ============
render_cover()

# ============ SLIDE 2 — DULU ============
render_content(
    "02/04", "02",
    ["DULU,"],
    "Tahun 1998–2010. Orang mencari bisnis lewat direktori dan mesin pencari sederhana.\n\nYang penting: website-nya ADA. Kata kunci diulang-ulang, link asal pasang — yang penting muncul.\n\nSiapa pun yang punya website, menang.",
)

# ============ SLIDE 3 — SEKARANG ============
render_content(
    "03/04", "03",
    ["SEKARANG,"],
    "Tahun 2011–2024. Google makin pintar — paham maksud di balik kata kunci.\n\nKonten asal tidak cukup. Yang penting: website-nya TERPERCAYA.\n\nKonten bermanfaat, reputasi baik, pengalaman pengguna nyaman — itu yang naik ke halaman satu.",
)

# ============ SLIDE 4 — MASA DEPAN ============
render_content(
    "04/04", "04",
    ["MASA", "DEPAN,"],
    "Tahun 2025 ke atas. Orang bertanya ke AI — ChatGPT, Gemini, dan mesin AI lainnya.\n\nYang penting bukan sekadar muncul di Google, tapi juga DITEMUKAN mesin AI. Ini yang disebut GEO — Generative Engine Optimization.\n\nBisnis yang dipahami AI, akan direkomendasikan AI.",
)

print("\n📦 Selesai! 4 slides Growth Theory Ep.01")
