#!/usr/bin/env python3
"""
Generate Threads images for @ukyhandoko
3 background variants: Biru (#1E40AF), Putih (#FFFFFF), Orange (#F97316)
Resolusi: 1080×1920 (portrait 9:16)
Margin 65px rata semua sisi
Font: Poppins (Bold/Regular)
"""

from PIL import Image, ImageDraw, ImageFont
import os, textwrap

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

W, H = 1080, 1920
M = 65
MAX_W = W - 2 * M  # 950

BLUE = (30, 64, 175)        # #1E40AF
WHITE = (255, 255, 255)
ORANGE = (249, 115, 22)     # #F97316
DARK = (40, 40, 40)
BLUE_TEXT = (30, 64, 175)

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

# Font sizes
BOLD110 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 110)
BOLD85 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 85)
BOLD65 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 65)
BOLD50 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 50)
REG45 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 45)
REG40 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 40)
REG36 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 36)
REG30 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 30)
REG24 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 24)
REG20 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 20)

def wrap_text(text, font, max_width):
    """Wrap text to fit max_width using textbbox."""
    words = text.split()
    lines = []
    current = ""
    for w in words:
        test = current + " " + w if current else w
        bbox = font.getbbox(test)
        tw = bbox[2] - bbox[0]
        if tw <= max_width:
            current = test
        else:
            if current:
                lines.append(current)
            current = w
    if current:
        lines.append(current)
    return lines

def draw_lines(draw, lines, font, start_y, color, line_spacing=8, max_width=MAX_W):
    """Draw wrapped lines, return next Y position."""
    y = start_y
    for line in lines:
        # Re-wrap if line too long
        wrapped = wrap_text(line, font, max_width)
        for wl in wrapped:
            draw.text((M, y), wl, fill=color, font=font)
            y += font.size + line_spacing
    return y

def make_slide(bg_color, text_color, title, body="", footer_text="", 
               title_font=BOLD85, body_font=REG36, filename="slide.png",
               page_number=""):
    """Generate one slide."""
    img = Image.new("RGB", (W, H), bg_color)
    draw = ImageDraw.Draw(img)
    
    # Header
    draw.text((M, M), "@ukyhandoko", font=REG24, fill=text_color)
    if page_number:
        draw.text((W - M, M), page_number, font=REG20, fill=text_color, anchor="rt")
    
    # Title
    title_lines = wrap_text(title, title_font, MAX_W)
    y = 280
    y = draw_lines(draw, title_lines, title_font, y, text_color, 4)
    
    # Divider
    y += 20
    draw.line([(M, y), (M + 200, y)], fill=text_color, width=3)
    y += 30
    
    # Body
    if body:
        body_lines = wrap_text(body, body_font, MAX_W)
        # Make sure we don't overflow
        total_height = len(body_lines) * (body_font.size + 8)
        if y + total_height > H - 120:
            # Truncate lines
            available = H - 120 - y
            max_lines = max(1, available // (body_font.size + 8))
            body_lines = body_lines[:max_lines]
        y = draw_lines(draw, body_lines, body_font, y, text_color, 8)
    
    # Footer
    footer_y = H - M
    if footer_text:
        draw.text((M, footer_y), footer_text, font=REG20, fill=text_color)
    
    path = os.path.join(OUT_DIR, filename)
    img.save(path, "PNG")
    print(f"  ✅ {filename}")
    return path

# ============================================================
# KONTEN POSTINGAN
# ============================================================

# Set 1: BLUE BACKGROUND — Tips Bisnis & Digital
print("\n🔵 SET 1 — BLUE BACKGROUND (#1E40AF)")
make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="Digital Marketing Bukan Sekadar\nPasang Iklan",
    body="Banyak yang pikir digital marketing cuma Facebook Ads doang.\n\nPadahal strategi yang bener mencakup SEO, konten, branding, email marketing, dan data analytics.\n\nIklan cuma salah satu tools. Tanpa fondasi yang kuat, iklan cuma bakar duit.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="01_blue_digital_marketing.png",
    page_number="1/6"
)

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="Kenapa Website Perlu\nDioptimasi Terus?",
    body="Bukan cuma sekali bikin trus diemin.\n\nAlgoritma Google berubah. Tren user berubah. Kompetitor makin pintar.\n\nWebsite itu seperti toko fisik — kalau gak dirawat, debu numpuk, pelanggan kabur.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="02_blue_website_optimasi.png",
    page_number="2/6"
)

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="3 Hal yang Gak Pernah\nGue Sesali di Bisnis",
    body="1. Gagal cepat — belajar lebih banyak dari error daripada teori\n2. Investasi di brand sejak awal — bukan cuma jualan\n3. Rekrut orang yang lebih pintar — ego harus ditaruh di luar kantor",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="03_blue_3_hal_bisnis.png",
    page_number="3/6"
)

# Set 2: WHITE BACKGROUND — Leadership & Insight
print("\n⚪ SET 2 — WHITE BACKGROUND (#FFFFFF)")
make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Leadership Itu Tentang\nMelayani, Bukan Memerintah",
    body="Leader sejati bukan yang paling vokal di meeting. Tapi yang bikin timnya berani ngomong, berani gagal, dan berani tumbuh.\n\nSaya belajar ini dari 10+ tahun jalani bisnis. Ego cuma bikin tim mati langkah.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="04_white_leadership.png",
    page_number="4/6"
)

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Brand Bukan Logo,\nBrand Itu Perasaan",
    body="Logo cuma simbol. Brand itu bagaimana orang merasa setelah berinteraksi dengan bisnis Anda.\n\nApakah mereka percaya? Nyaman? Ingin balik lagi?\n\nItu yang dibangun bukan oleh desainer, tapi oleh seluruh tim.",
    footer_text="dmark.id • Strategic Branding Agency",
    title_font=BOLD85,
    body_font=REG36,
    filename="05_white_brand.png",
    page_number="5/6"
)

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Gagal Satu Proyek\nBukan Gagal Total",
    body="Pernah kehilangan klien besar gara-gara miss komunikasi. Waktu itu rasanya pengen tutup usaha.\n\nTapi justru dari situ saya belajar: sistem bukan segalanya, komunikasi manual tetap penting.\n\nHari ini, klien yang dulu pergi malah balik lagi.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="06_white_gagal.png",
    page_number="6/6"
)

# Set 3: ORANGE BACKGROUND — Agency Life & Growth
print("\n🟠 SET 3 — ORANGE BACKGROUND (#F97316)")

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Agak Lain: Kenapa Saya\nPilih Jalan Berbeda",
    body="Kebanyakan agency main aman: template sama, strategi itu-itu aja.\n\nSaya milih beda. Data-driven, bukan feeling-driven. Bukan cuma bikin cantik, tapi bikin efektif.\n\nHasilnya? Klien bertahan lebih lama. Karena mereka lihat ROI, bukan cuma gambar bagus.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="07_orange_agency_lain.png",
    page_number="1/6"
)

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Bisnis Bukan Sprint,\nIni Marathon Tanpa Finish",
    body="Yang bikin saya bertahan 10+ tahun di bisnis digital:\n\n1. Fokus pada proses, bukan hasil instan\n2. Bangun hubungan, bukan transaksi\n3. Upgrade skill tiap hari — kalau berhenti belajar, mati\n4. Kelilingi diri dengan orang yang lebih hebat",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="08_orange_bisnis_marathon.png",
    page_number="2/6"
)

# Set 4: BLUE — AI & Technology
print("\n🔵 SET 4 — BLUE BACKGROUND — AI & Technology")

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="AI Bukan Pengganti,\nTapi Akselerator",
    body="Banyak yang takut AI bakal gantiin pekerjaan. Saya justru pakai AI buat ngebut, bukan buat ngilangin manusia.\n\nTim saya pake AI buat:\n- Riset & drafting konten\n- Analisis data lebih cepat\n- Optimasi campaign\n\nManusia tetap pegang strategi & kreativitas.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="09_blue_ai.png",
    page_number="3/6"
)

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="GEO: Evolusi SEO\ndi Era AI",
    body="SEO dulu: riset keyword, bikin konten, nunggu 3-6 bulan.\n\nGEO (Generative Engine Optimization): konten harus jawab langsung pertanyaan user di era Google SGE, ChatGPT, Perplexity.\n\nYang gak beradaptasi, bakal tenggelam di hasil pencarian.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="10_blue_geo.png",
    page_number="4/6"
)

# Set 5: WHITE — Life Quotes & Reflection
print("\n⚪ SET 5 — WHITE — Life Quotes")

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Gak Semua yang\nDihitung Berarti",
    body="Di dunia digital, kita gila-gilaan ngejar metrik: views, likes, followers.\n\nTapi yang paling berarti justru yang gak dihitung: dampak, hubungan, kepercayaan.\n\nAngka boleh bagus, tapi kalo gak ada dampak, percuma.",
    footer_text="@ukyhandoko",
    title_font=BOLD85,
    body_font=REG36,
    filename="11_white_meaning.png",
    page_number="5/6"
)

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Satu Filosofi yang\nNggak Pernah Gagal",
    body="\"Help enough people get what they want, and you'll get what you want.\"\n\nBukan trik. Bukan manipulasi. Tapi genuinely bantu orang lain sukses.\n\nItu kenapa di StudioSoft, fokus utama kami bukan jualan — tapi bikin klien tumbuh. Duitnya datang dengan sendirinya.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="12_white_filosofi.png",
    page_number="6/6"
)

# Set 6: ORANGE — Digital Strategy & Insights
print("\n🟠 SET 6 — ORANGE — Digital Strategy")

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Jangan Bangun Website\nKalau Cuma Buat 'Punya'",
    body="Website bukan pajangan. Bukan portofolio yang didiemin.\n\nWebsite adalah mesin marketing 24 jam. Kalau gak ada strategi konten, SEO, dan optimasi konversi — mending gak usah bikin.\n\nLebih hemat duit dan tenaga.",
    footer_text="studiosoft.id • Digital Growth Partner",
    title_font=BOLD85,
    body_font=REG36,
    filename="13_orange_website.png",
    page_number="3/6"
)

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Kesalahan Terbesar\nSaya di 10 Tahun Bisnis",
    body="Dulu saya pikir scaling itu: kerja lebih keras, ambil lebih banyak klien.\n\nSalah besar. Scaling itu sistem, bukan tenaga.\n\nSekarang dengan tim lebih kecil, kami handle lebih banyak klien. Karena ada sistem, SOP, dan tools yang bener.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="14_orange_kesalahan.png",
    page_number="4/6"
)

# Set 7: BLUE — Social Media
print("\n🔵 SET 7 — BLUE — Social Media")

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="Jangan Posting\nSetiap Hari Kalau...",
    body="...konten Anda gak bermutu.\n\nKonsistensi itu penting. Tapi konsistensi konten jelek cuma bikin orang mute/unfollow.\n\nLebih baik posting 3x seminggu dengan kualitas tinggi, daripada 7x dengan konten asal-asalan.\n\nQuality > Quantity. Sederhana.",
    footer_text="@ukyhandoko",
    title_font=BOLD85,
    body_font=REG36,
    filename="15_blue_jangan_post.png",
    page_number="5/6"
)

make_slide(
    bg_color=BLUE, text_color=WHITE,
    title="Dulu Saya Pikir Personal\nBranding Itu 'Norak'",
    body="Saya kira cukup perusahaan aja yang branding. Ternyata di era digital, orang beli dari orang, bukan dari logo.\n\nSetelah mulai aktif di Threads & LinkedIn, klien baru datang bukan lewat website — tapi dari postingan yang mereka baca.\n\nPersonal branding bukan gengsi. Ini investasi.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="16_blue_personal_branding.png",
    page_number="6/6"
)

# Set 8: WHITE — Entrepreneur Mindset
print("\n⚪ SET 8 — WHITE — Entrepreneur Mindset")

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="Mindset yang Bikin\nSaya Bertahan di Bisnis",
    body="1. Gagal itu data — setiap error adalah informasi berharga\n2. Fokus pada kontrol — jangan sibuk mikirin hal di luar kendali Anda\n3. Uang adalah hasil sampingan dari solusi — bukan tujuan utama\n4. Rest is productive — burnout cuma bikin keputusan jelek",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="17_white_mindset.png",
    page_number="1/6"
)

make_slide(
    bg_color=WHITE, text_color=BLUE_TEXT,
    title="'Saya Baru Mulai,\nGak Punya Modal Besar'",
    body="Modal terbesar yang Anda punya sekarang:\n\n- Waktu — belajar lebih cepat dari kompetitor\n- Rasa lapar — founder yang kelaparan lebih kreatif\n- Jaringan — satu kenalan bisa buka pintu yang gak terduga\n\nModal bukan alasan. Excuses are tools of the incompetent.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="18_white_modal.png",
    page_number="2/6"
)

# Set 9: ORANGE — Client Relationship
print("\n🟠 SET 9 — ORANGE — Client Relationship")

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Klien Ideal Itu Seperti\nApa Sih Sebenarnya?",
    body="Bukan yang bayar paling besar.\nTapi yang:\n\n1. Paham bahwa hasil butuh proses (gak instan)\n2. Respect expertise kita (gak mikir bisa bikin sendiri)\n3. Bayar tepat waktu tanpa ditagih berkali-kali\n4. Mau diajak diskusi, bukan cuma nyuruh\n\nPercaya, klien kayak gini lebih langka dari klien gede.",
    footer_text="@ukyhandoko • Founder StudioSoft",
    title_font=BOLD85,
    body_font=REG36,
    filename="19_orange_klien_ideal.png",
    page_number="5/6"
)

make_slide(
    bg_color=ORANGE, text_color=WHITE,
    title="Klien Berhenti Karena\nMereka Gak Merasa Dihargai",
    body="Bukan karena harga mahal. Bukan karena hasil kurang.\n\nTapi karena komunikasi yang buruk. Karena mereka merasa cuma nomor. Karena janji gak ditepati.\n\nRetensi klien itu 90% komunikasi, 10% sisanya teknis.\n\nJangan lupa: orang lupa apa yang Anda bilang, tapi ingat bagaimana Anda bikin mereka merasa.",
    footer_text="dmark.id • Strategic Branding Agency",
    title_font=BOLD85,
    body_font=REG36,
    filename="20_orange_klien_pergi.png",
    page_number="6/6"
)

print(f"\n{'='*50}")
print(f"✅ SELESAI! Semua gambar tersimpan di: {OUT_DIR}")
print(f"📁 Total: 20 gambar — 3 varian background")
print(f"   🔵 Biru: 7 gambar")
print(f"   ⚪ Putih: 7 gambar")
print(f"   🟠 Orange: 6 gambar")
