#!/usr/bin/env python3
"""Generate AI Overview carousel for Threads (1080x1350, 4:5 portrait)."""
from PIL import Image, ImageDraw, ImageFont
import os

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

W, H = 1080, 1350
MARGIN = 65
MAX_W = W - 2*MARGIN

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

# Fonts
FONT_DIR = "/home/mantapman/.fonts/poppins"
FONT_DIR2 = "/home/mantapman/.fonts"

def get_font(name, size):
    if name == "Bold":
        return ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), size)
    elif name == "SemiBold":
        return ImageFont.truetype(os.path.join(FONT_DIR2, "Poppins-SemiBold.ttf"), size)
    else:
        return ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), size)

BOLD90 = get_font("Bold", 90)
BOLD80 = get_font("Bold", 80)
SEMIBOLD50 = get_font("SemiBold", 50)
REGULAR38 = get_font("Regular", 38)
REGULAR32 = get_font("Regular", 32)
REGULAR28 = get_font("Regular", 28)
BOLD100 = get_font("Bold", 100)

def wrap_lines(draw, text, font, max_w):
    """Manual line wrap, returns list of (text, font)."""
    lines = []
    for para in text.split('\n'):
        if para.strip() == '':
            lines.append(('', font))
            continue
        words = para.split()
        current = ""
        for word in words:
            test = current + word + " "
            if draw.textlength(test, font=font) <= max_w:
                current = test
            else:
                if current:
                    lines.append((current.rstrip(), font))
                current = word + " "
        if current.strip():
            lines.append((current.rstrip(), font))
    return lines

def draw_slide(num, bg_color, is_blue, content_blocks, subtitle=None, cover=False):
    """content_blocks: [(text, font_override), ...]"""
    img = Image.new("RGB", (W, H), bg_color)
    draw = ImageDraw.Draw(img)
    
    tc = WHITE if is_blue else BLUE  # text color
    
    # Header
    draw.text((MARGIN, 30), "StudioSoft", fill=tc, font=REGULAR28)
    
    if not cover:
        draw.text((MARGIN, 30), f"StudioSoft  •  {num}/5", fill=tc, font=REGULAR28)
    
    # Footer
    draw.text((MARGIN, H-50), "studiosoft.id", fill=tc, font=REGULAR28)
    
    y = 130
    for text, font_ov in content_blocks:
        font = font_ov if font_ov else REGULAR38
        lines = wrap_lines(draw, text, font, MAX_W)
        for line_text, line_font in lines:
            if line_text:
                draw.text((MARGIN, y), line_text, fill=tc, font=line_font)
                y += line_font.size + 6
        y += 10
    return img

def cover_slide():
    img = Image.new("RGB", (W, H), BLUE)
    draw = ImageDraw.Draw(img)
    draw.text((MARGIN, 30), "StudioSoft", fill=WHITE, font=REGULAR28)
    draw.text((MARGIN, H-50), "studiosoft.id", fill=WHITE, font=REGULAR28)
    
    # Title
    draw.text((MARGIN, 300), "AI Overview, GEO", fill=WHITE, font=BOLD90)
    draw.text((MARGIN, 400), "& SEO di 2026", fill=WHITE, font=BOLD90)
    
    # Subtitle
    draw.text((MARGIN, 580), "Evolusi Pencarian menuju", fill=WHITE, font=SEMIBOLD50)
    draw.text((MARGIN, 640), "Search Everywhere Optimization", fill=WHITE, font=SEMIBOLD50)
    
    # Source
    src_y = 900
    draw.text((MARGIN, src_y), "Sumber: Backlinko • Neil Patel • SparkToro", fill=LIGHT_BLUE, font=REGULAR32)
    
    img.save(f"{OUT_DIR}/01_cover.png")
    print("✅ 01_cover.png")

def slide2():
    blocks = [
        ("Apa Itu AI Overviews?", BOLD80),
        ("", None),
        ("Google AI Overviews muncul di 16% dari seluruh pencarian \u2014 naik dari 6,5% setahun lalu. (Semrush)", REGULAR38),
        ("", None),
        ("Alih-alih 10 link biru, Google langsung menyusun jawaban dari berbagai sumber pakai AI generatif.", REGULAR38),
        ("", None),
        ("Dampak: jutaan pencarian per bulan \u2014 jawaban dikasih langsung tanpa perlu klik ke website.", REGULAR38),
        ("", None),
        ("Tapi ini bukan akhir SEO. Ini evolusi ke Search Everywhere Optimization.", SEMIBOLD50),
    ]
    img = draw_slide(2, WHITE, False, blocks)
    img.save(f"{OUT_DIR}/02_ai_overviews.png")
    print("✅ 02_ai_overviews.png")

def slide3():
    blocks = [
        ("SEO vs GEO", BOLD80),
        ("", None),
        ("SEO = optimasi untuk ranking di Google (10 link biru). Fokus: keyword + backlink.", REGULAR38),
        ("", None),
        ("GEO = optimasi biar disebut di jawaban ChatGPT, Gemini, Perplexity dll. Fokus: konten informatif + otoritas.", REGULAR38),
        ("", None),
        ("Data Backlinko: referral dari AI/LLM naik 800% dalam 3 bulan. Semrush: LLM overtake Google akhir 2027.", SEMIBOLD50),
        ("", None),
        ("\u201cSEO dulu soal ranking. Sekarang soal relevance dan trust di tiap platform.\u201d \u2014 Neil Patel", REGULAR38),
    ]
    img = draw_slide(3, BLUE, True, blocks)
    img.save(f"{OUT_DIR}/03_seo_vs_geo.png")
    print("✅ 03_seo_vs_geo.png")

def slide4():
    blocks = [
        ("Search Everywhere\nOptimization", BOLD80),
        ("", None),
        ("SparkToro: 73% search intent masih di Google. Tapi 27% sisanya tersebar di 40+ platform lain (YouTube, Reddit, ChatGPT, TikTok, Amazon).", REGULAR38),
        ("", None),
        ("Framework: Managed Experiences (website, sosmed) + Influenced Experiences (review, forum, publikasi pihak ketiga).", REGULAR38),
        ("", None),
        ("Brand dikutip AI 6,5x lebih sering dari sumber pihak ketiga dibanding website sendiri. (Kevin Indig)", SEMIBOLD50),
    ]
    img = draw_slide(4, WHITE, False, blocks)
    img.save(f"{OUT_DIR}/04_search_everywhere.png")
    print("✅ 04_search_everywhere.png")

def slide5():
    blocks = [
        ("3 Langkah Memulai", BOLD80),
        ("", None),
        ("1. Audit \u2014 di mana audiens mencari? Google? YouTube? ChatGPT? Reddit? TikTok?", REGULAR38),
        ("", None),
        ("2. Optimasi managed \u2014 website, GBP, YouTube channel, profil sosmed. Pastikan teknis rapi.", REGULAR38),
        ("", None),
        ("3. Bangun influenced \u2014 ulasan, guest posting, forum, publikasi industri. AI suka sumber pihak ketiga.", REGULAR38),
        ("", None),
        ("Yang adaptasi sekarang, yang menang di 2027.", BOLD90),
    ]
    img = draw_slide(5, BLUE, True, blocks)
    img.save(f"{OUT_DIR}/05_langkah.png")
    print("✅ 05_langkah.png")

# Generate all
cover_slide()
slide2()
slide3()
slide4()
slide5()

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