#!/usr/bin/env python3
"""StudioSoft Healthcare Carousel — hc31 "SEO Lokal untuk Klinik: Biar Pasien Sekitar Mudah Menemukan Anda"
Resolusi: 1080x1350 (4:5 portrait)
BG: Biru royal #1E3A8A | Teks: Putih | Accent: Cyan #22D3EE | Font: Poppins
5 slide: cover, kenapa, isi, langkah, cta
Sumber: https://studiosoft.id/tips-seo-digital-marketing-surabaya-optimasi-local-untuk-klinik-dan-bengkel-lokal/
"""
from PIL import Image, ImageDraw, ImageFont
import os

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

W, H = 1080, 1350
BLUE = (30, 58, 138)
CYAN = (34, 211, 238)
WHITE = (255, 255, 255)
M = 65

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


def F(name, size):
    return ImageFont.truetype(os.path.join(FONT_DIR, name), size)


B130 = F("Poppins-Bold.ttf", 130)
B120 = F("Poppins-Bold.ttf", 120)
B110 = F("Poppins-Bold.ttf", 110)
B90 = F("Poppins-Bold.ttf", 90)
B80 = F("Poppins-Bold.ttf", 80)
B70 = F("Poppins-Bold.ttf", 70)
B50 = F("Poppins-Bold.ttf", 50)
B40 = F("Poppins-Bold.ttf", 40)
B30 = F("Poppins-Bold.ttf", 30)
SB36 = F("Poppins-SemiBold.ttf", 36)
SB32 = F("Poppins-SemiBold.ttf", 32)
REG36 = F("Poppins-Regular.ttf", 36)
REG32 = F("Poppins-Regular.ttf", 32)
REG28 = F("Poppins-Regular.ttf", 28)
REG26 = F("Poppins-Regular.ttf", 26)
REG24 = F("Poppins-Regular.ttf", 24)
REG20 = F("Poppins-Regular.ttf", 20)


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


def wrap(drw, text, font, max_w):
    words = text.split()
    lines, cur = [], ""
    for w_ in words:
        trial = (cur + " " + w_).strip()
        if drw.textlength(trial, font=font) <= max_w:
            cur = trial
        else:
            if cur:
                lines.append(cur)
            cur = w_
    if cur:
        lines.append(cur)
    return lines


def draw_wrapped(drw, xy, text, font, fill, max_w, lh=None):
    x, y = xy
    lh = lh or int(fh(drw, "Ag", font) * 1.22)
    for ln in wrap(drw, text, font, max_w):
        drw.text((x, y), ln, font=font, fill=fill)
        y += lh
    return y


def header_footer(d, num, tag):
    d.text((M, 30), "STUDIOSOFT", font=B30, fill=WHITE)
    d.text((W - M, 30), f"{num}/5", font=REG24, fill=WHITE, anchor="rt")
    d.text((M, H - 50), "studiosoft.id", font=REG20, fill=WHITE)
    d.text((W - M, H - 50), tag, font=REG20, fill=WHITE, anchor="rt")


def slide_cover():
    img = Image.new("RGB", (W, H), BLUE)
    d = ImageDraw.Draw(img)
    header_footer(d, "1", "#LocalSEO")

    d.text((M, 120), "SEO LOKAL", font=B110, fill=CYAN)
    d.text((M, 300), "UNTUK KLINIK", font=B90, fill=WHITE)

    y = 540
    for i in range(6):
        dx = M + i * 30
        d.line([(dx, y), (dx + 18, y)], fill=CYAN, width=3)

    draw_wrapped(d, (M, y + 40), "5 langkah biar pasien di sekitar Anda menemukan klinik di Google — dari Google Maps sampai halaman 1 pencarian.", REG32, WHITE, W - 2 * M)

    draw_wrapped(d, (M, 940), "Tips SEO lokal dari artikel StudioSoft untuk klinik & RS", SB32, WHITE, W - 2 * M)

    p = os.path.join(OUT_DIR, "01_cover.png")
    img.save(p, "PNG")
    print(f"OK {p}")
    return p


def slide_kenapa():
    img = Image.new("RGB", (W, H), BLUE)
    d = ImageDraw.Draw(img)
    header_footer(d, "2", "#LocalSEO")

    d.text((M, 100), "KENAPA LOCAL", font=B110, fill=WHITE)
    d.text((M, 245), "SEO PENTING?", font=B90, fill=CYAN)

    items = [
        "1. 46% pencarian Google punya maksud lokal — orang mencari yang dekat dengannya",
        "2. 88% pencari bisnis lokal langsung menghubungi atau datang dalam 24 jam",
        "3. 76% pencarian lokal dilakukan dari HP",
        "4. Klinik tanpa profil Google yang rapi = hilang dari peta calon pasien",
    ]
    y = 460
    for s in items:
        y = draw_wrapped(d, (M, y), s, SB36, WHITE, W - 2 * M - 20)
        y += 60

    draw_wrapped(d, (M, 1125), "Pasien tidak lagi membuka Yellow Pages — mereka mengetik \"klinik terdekat\" di Google.", REG26, WHITE, W - 2 * M)

    p = os.path.join(OUT_DIR, "02_kenapa.png")
    img.save(p, "PNG")
    print(f"OK {p}")
    return p


def slide_isi():
    img = Image.new("RGB", (W, H), BLUE)
    d = ImageDraw.Draw(img)
    header_footer(d, "3", "#LocalSEO")

    d.text((M, 80), "5 LANGKAH", font=B110, fill=WHITE)
    d.text((M, 225), "SEO LOKAL", font=B90, fill=CYAN)

    items = [
        "1. Optimasi Google Business Profile: data, foto, ulasan",
        "2. Riset kata kunci lokal long-tail, mis. \"klinik kulit terdekat\"",
        "3. Konten hyperlocal yang menyebut area sekitar + mobile-friendly",
        "4. Citation & backlink lokal: NAP konsisten di direktori",
        "5. Pantau dengan Analytics, sesuaikan strategi tiap bulan",
    ]
    y = 400
    for s in items:
        y = draw_wrapped(d, (M, y), s, REG28, WHITE, W - 2 * M - 20)
        y += 72

    draw_wrapped(d, (M, 1160), "Target kata kunci volume 100-500/bulan, kompetisi rendah = ranking lebih cepat naik.", REG26, WHITE, W - 2 * M)

    p = os.path.join(OUT_DIR, "03_isi.png")
    img.save(p, "PNG")
    print(f"OK {p}")
    return p


def slide_langkah():
    img = Image.new("RGB", (W, H), BLUE)
    d = ImageDraw.Draw(img)
    header_footer(d, "4", "#LocalSEO")

    d.text((M, 100), "MULAI DARI", font=B120, fill=WHITE)
    d.text((M, 260), "BUSINESS PROFILE", font=B70, fill=CYAN)

    items = [
        ("1", "Lengkapi nama, alamat, jam buka — konsisten di semua kanal (NAP)."),
        ("2", "Tambah foto asli & kategori layanan yang tepat."),
        ("3", "Undang pasien memberi ulasan, balas setiap review."),
        ("4", "Posting update mingguan: promo & layanan terbaru."),
    ]
    y = 450
    for num, text in items:
        d.text((M, y), num, font=B50, fill=WHITE)
        yy = draw_wrapped(d, (M + 80, y + 6), text, REG28, WHITE, W - M - 80 - 40)
        y = yy + 76

    draw_wrapped(d, (M, 1160), "Profil Google yang rapi = trust signal di mata Google dan calon pasien.", REG26, WHITE, W - 2 * M)

    p = os.path.join(OUT_DIR, "04_langkah.png")
    img.save(p, "PNG")
    print(f"OK {p}")
    return p


def slide_cta():
    img = Image.new("RGB", (W, H), BLUE)
    d = ImageDraw.Draw(img)
    header_footer(d, "5", "#LocalSEO")

    d.text((M, 120), "SIAP", font=B130, fill=WHITE)
    d.text((M, 280), "DITEMUKAN", font=B90, fill=CYAN)
    d.text((M, 450), "PASIEN BARU?", font=B110, fill=WHITE)

    d.text((M, 700), "Klinik yang tampil di Google Maps, punya website", font=SB32, fill=WHITE)
    d.text((M, 750), "cepat, dan rajin mengedukasi, akan terus", font=SB32, fill=WHITE)
    d.text((M, 800), "didatangi pasien baru.", font=SB32, fill=WHITE)

    d.text((M, 950), "Butuh bantuan SEO lokal klinik Anda?", font=REG32, fill=WHITE)
    d.text((M, 1070), "Konsultasi Gratis", font=B50, fill=WHITE)
    d.text((M, 1170), "www.studiosoft.id", font=REG36, fill=WHITE)

    p = os.path.join(OUT_DIR, "05_cta.png")
    img.save(p, "PNG")
    print(f"OK {p}")
    return p


def generate_all():
    print("StudioSoft Healthcare Carousel — hc31 SEO Lokal untuk Klinik")
    print("=" * 45)
    paths = [slide_cover(), slide_kenapa(), slide_isi(), slide_langkah(), slide_cta()]
    print(f"OK {len(paths)} slide generated in {OUT_DIR}")
    return paths


if __name__ == "__main__":
    generate_all()
