#!/usr/bin/env python3
"""DMark Carousel Generator — 5 slide IG carousel
Specs: 1080x1350, Orange (#FF6600) ↔ White bg, Inter font
"""

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

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

W, H = 1080, 1350
ORANGE = (255, 102, 0)
WHITE = (255, 255, 255)
ORANGE_LIGHT = (255, 237, 224)  # subtle orange grid bg

# Fonts
TTC_PATH = "/tmp/Inter.ttc"

def get_font(size, index=0):
    return ImageFont.truetype(TTC_PATH, size, index=index)

FONT_BLACK_130 = get_font(130, index=0)  # Inter Regular (need index for Black)
# Try different indices for Inter Black (it's in the TTC)
FONT_TITLE = None
for idx in range(8):
    try:
        f = ImageFont.truetype(TTC_PATH, 130, index=idx)
        # test render
        test_img = Image.new("RGB", (100,100))
        test_draw = ImageDraw.Draw(test_img)
        test_draw.text((0,0), "H", font=f, fill=(0,0,0))
        FONT_TITLE = f
        break
    except:
        continue

# Let's use the variable font approach - load with specific weight
# For Inter.ttc: index 0 = Inter Regular, index 1-...variable
# Better: use font size that looks like Black 130 in smaller scale
FONT_BODY = get_font(34, index=0)
FONT_SMALL = get_font(24, index=0)
FONT_NUM = get_font(70, index=0)

def draw_centered_text(draw, text, y, font, fill, max_w=900):
    """Draw text centered horizontally at y"""
    lines = []
    for line in text.split("\n"):
        # Word wrap
        words = line.split()
        current = ""
        for w in words:
            test = current + " " + w if current else w
            bbox = draw.textbbox((0, 0), test, font=font)
            tw = bbox[2] - bbox[0]
            if tw > max_w and current:
                lines.append(current)
                current = w
            else:
                current = test
        if current:
            lines.append(current)
    
    total_h = sum(draw.textbbox((0, 0), l, font=font)[3] - draw.textbbox((0, 0), l, font=font)[1] + 12 for l in lines)
    cur_y = y - total_h // 2
    
    for line in lines:
        bbox = draw.textbbox((0, 0), line, font=font)
        lw = bbox[2] - bbox[0]
        x = (W - lw) // 2
        draw.text((x, cur_y), line, font=font, fill=fill)
        cur_y += bbox[3] - bbox[1] + 12

def draw_left_text(draw, text, x, y, font, fill, max_w=900, line_spacing=1.3):
    """Draw text left-aligned starting at (x,y)"""
    lines = []
    for para in text.split("\n"):
        words = para.split()
        current = ""
        for w in words:
            test = current + " " + w if current else w
            bbox = draw.textbbox((0, 0), test, font=font)
            tw = bbox[2] - bbox[0]
            if tw > max_w and current:
                lines.append(current)
                current = w
            else:
                current = test
        if current:
            lines.append(current)
    
    cur_y = y
    for line in lines:
        draw.text((x, cur_y), line, font=font, fill=fill)
        bbox = draw.textbbox((0, 0), line, font=font)
        cur_y += int((bbox[3] - bbox[1]) * line_spacing)

def create_slide(background, text_items, filename):
    """Create a slide with background color and text items.
    text_items = [(text, font, fill, align), ...]
    """
    img = Image.new("RGB", (W, H), background)
    draw = ImageDraw.Draw(img)
    
    # Add subtle grid for white bg
    if background == WHITE:
        grid_color = (255, 237, 224)  # very light orange
        for y in range(0, H, 80):
            draw.line([(0, y), (W, y)], fill=grid_color, width=1)
        for x in range(0, W, 80):
            draw.line([(x, 0), (x, H)], fill=grid_color, width=1)
    
    if background == ORANGE:
        # Add subtle darker orange stripe at bottom
        for i in range(H - 200, H):
            alpha = int(200 * (1 - (i - (H-200)) / 200))
            stripe = Image.new("RGBA", (W, 1), (0, 0, 0, alpha))
            img.paste(stripe, (0, i), stripe)
    
    # "DMark Creative" logo area
    logo_font = get_font(22, index=0)
    if background == ORANGE:
        draw.text((50, 50), "DMark  Creative", font=logo_font, fill=WHITE)
    else:
        draw.text((50, 50), "DMark  Creative", font=logo_font, fill=ORANGE)
    
    # Draw items
    for item in text_items:
        text, font, fill, align, y = item
        if align == "center":
            draw_centered_text(draw, text, y, font, fill)
        elif align == "left":
            draw_left_text(draw, text, 100, y, font, fill, max_w=880)
        elif align == "ctr_left":
            # Centered but left-aligned block
            bbox = draw.textbbox((0, 0), text, font=font)
            text_h = bbox[3] - bbox[1]
            draw_left_text(draw, text, 100, y - text_h//2, font, fill, max_w=880)
    
    path = os.path.join(OUT_DIR, filename)
    img.save(path, "PNG")
    print(f"Saved: {path}")
    return path

# Styling helper - big title using large DejaVu-like approach
# Since Inter TTC may not have Black, we'll use smaller alternative
# Actually the TTC has all weights - let's test what index is Black

# Find Inter Black in TTC
for idx in range(10):
    try:
        f = ImageFont.truetype(TTC_PATH, 50, index=idx)
        test = Image.new("RGB", (200,100))
        td = ImageDraw.Draw(test)
        bbox = td.textbbox((0,0), "Hello", font=f)
        # print(f"Index {idx}: width={bbox[2]-bbox[0]}, name={f.getname() if hasattr(f,'getname') else '?'}")
    except:
        pass

# =============== SLIDE 1: COVER ===============
print("=== Slide 1: Cover ===")
# Use Inter at index 0 (Regular) at larger size to simulate
# Or try to get Inter Variable font
try:
    FONT_BLACK = ImageFont.truetype(TTC_PATH, 130, index=1)  # Try variable font
except:
    FONT_BLACK = FONT_BODY  # fallback

# Test
test_img = Image.new("RGB", (500, 100))
td = ImageDraw.Draw(test_img)
td.text((0,0), "TEST", font=FONT_BLACK, fill=(0,0,0))

# Let's try fontsize 120 with weight
# Actually, let's just use what we have and make it look good
# Use Inter at large size - TTC has Inter which is all weights

# Try loading with specific weight
try:
    # Fallback: DejaVu Sans Bold
    FONT_TITLE = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 120)
    FONT_TITLE_SMALL = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 90)
except:
    FONT_TITLE = get_font(120, index=1)  # variable
    FONT_TITLE_SMALL = get_font(80, index=1)

# Actually let's just use large Inter text - the variable font works
# Let's create the variable font properly
var_font = ImageFont.truetype("/tmp/Inter-Variable.ttf" if os.path.exists("/tmp/Inter-Variable.ttf") else TTC_PATH, 120)

if os.path.exists("/tmp/Inter-Variable.ttf"):
    FONT_TITLE = ImageFont.truetype("/tmp/Inter-Variable.ttf", 120)
else:
    FONT_TITLE = get_font(120, index=0)  # Inter from TTC, large

FONT_BODY_BIG = get_font(40, index=0)

# =============== SLIDE 1: COVER ===============
cover_items = [
    ("Digital Marketing\nuntuk Klinik & RS", FONT_TITLE, WHITE, "center", H//2 - 100),
    ("Strategi Tepat Menjangkau Pasien\ndi Era Digital", get_font(34, index=0), ORANGE_LIGHT, "center", H//2 + 180),
    ("dmark.id", get_font(28, index=0), WHITE, "center", H - 120),
]
p1 = create_slide(ORANGE, cover_items, "01_cover.png")

# =============== SLIDE 2: WHY (Putih) ===============
items2 = [
    ("Mengapa Klinik & RS", FONT_TITLE, ORANGE, "left", 120),
    ("Perlu Digital Marketing?", FONT_TITLE, ORANGE, "left", 260),
]
# Numbered list
list_items = [
    ("01", "90% pasien cari info kesehatan secara online"),
    ("02", "Milenial & Gen Z pilih RS berdasarkan review digital"),
    ("03", "Kompetitor sudah online — yang duluan yang menang"),
    ("04", "Biaya iklan digital lebih efisien vs media konvensional"),
]

y_start = 420
for i, (num, desc) in enumerate(list_items):
    items2.append((num, FONT_NUM, ORANGE, "left", y_start + i * 200))
    items2.append((desc, FONT_BODY, (100, 100, 100), "left", y_start + i * 200 + 70))

p2 = create_slide(WHITE, items2, "02_mengapa.png")

# =============== SLIDE 3: STRATEGI 1 (Orange) ===============
items3 = [
    ("Strategi #1", FONT_TITLE_SMALL, WHITE, "left", 120),
    ("Konten Edukasi\n& Branding", FONT_TITLE, WHITE, "left", 230),
]
strat1_points = [
    "▸ Artikel SEO tentang kesehatan & layanan",
    "▸ Testimoni pasien — video & teks",
    "▸ Infografis layanan medis yang informatif",
    "▸ Konten IG/FB yang edukatif & membangun kepercayaan",
]
sy = 500
for pt in strat1_points:
    items3.append((pt, FONT_BODY, ORANGE_LIGHT, "left", sy))
    sy += 80

p3 = create_slide(ORANGE, items3, "03_strategi1.png")

# =============== SLIDE 4: STRATEGI 2 (Putih) ===============
items4 = [
    ("Strategi #2", FONT_TITLE_SMALL, ORANGE, "left", 120),
    ("Google & Sosial\nMedia Ads", FONT_TITLE, ORANGE, "left", 230),
]
strat2_points = [
    "▸ Google Ads untuk keyword kesehatan (SEO+)",
    "▸ Meta Ads targeting lokasi & demografis",
    "▸ Remarketing pasien yang sudah tertarik",
    "▸ Landing page optimal + booking online",
]
sy = 500
for pt in strat2_points:
    items4.append((pt, FONT_BODY, (80, 80, 80), "left", sy))
    sy += 80

p4 = create_slide(WHITE, items4, "04_strategi2.png")

# =============== SLIDE 5: CTA (Orange) ===============
items5 = [
    ("Siap Kembangkan", FONT_TITLE_SMALL, WHITE, "center", H//2 - 200),
    ("Klinik atau RS Anda?", FONT_TITLE, WHITE, "center", H//2 - 80),
    ("Konsultasi GRATIS dengan tim DMark Creative\nKami bantu strategi yang tepat untuk Anda", get_font(34, index=0), ORANGE_LIGHT, "center", H//2 + 80),
]

# Draw CTA button
# We'll add button overlay in code
items5.append(("Hubungi Kami  →", get_font(36, index=0), WHITE, "center", H//2 + 260))

p5 = create_slide(ORANGE, items5, "05_cta.png")

# Now add WhatsApp button to slide 5 manually
img5 = Image.open(p5)
draw5 = ImageDraw.Draw(img5)
# Draw button background
btn_w, btn_h = 400, 70
btn_x = (W - btn_w) // 2
btn_y = H//2 + 240
# Rounded rect style - white bg for CTA button
for y in range(btn_y, btn_y + btn_h):
    for x in range(btn_x, btn_x + btn_w):
        # Check if inside rounded corners
        rx, ry = abs(x - btn_x - btn_w//2), abs(y - btn_y - btn_h//2)
        if rx > btn_w//2 - 35 or ry > btn_h//2 - 35:
            # Corner area
            cx, cy = btn_x+35 if x < btn_x+btn_w//2 else btn_x+btn_w-36, btn_y+35 if y < btn_y+btn_h//2 else btn_y+btn_h-36
            dx, dy = x - cx, y - cy
            if dx*dx + dy*dy <= 30*30:
                img5.putpixel((x, y), WHITE)
            # Leave rest transparent
        else:
            img5.putpixel((x, y), WHITE)

# Redraw text on button
draw5.text((btn_x + btn_w//2 + 25, btn_y + btn_h//2 - 18), "Hubungi Kami", font=get_font(30, index=0), fill=ORANGE, anchor="mm")
# WhatsApp logo (simple green circle)
w_x, w_y = btn_x + 45, btn_y + btn_h//2
# Full WhatsApp icon (green circle white phone)
import math
for angle_deg in range(360):
    rad = math.radians(angle_deg)
    px = int(w_x + 18 * math.cos(rad))
    py = int(w_y + 18 * math.sin(rad))
    if 0 <= px < W and 0 <= py < H:
        img5.putpixel((px, py), (37, 211, 102))  # WhatsApp green

# Save updated
img5.save(p5)
print(f"Updated: {p5}")

print(f"\n✅ All 5 DMark carousel slides saved to: {OUT_DIR}")
print("Files:")
for f in sorted(os.listdir(OUT_DIR)):
    print(f"  {f}")
