#!/usr/bin/env python3
"""StudioSoft Healthcare Carousel — hc36 "Jasa Digital Marketing Klinik: Cara Menarik Pasien Baru dari Google".

Cron run 14 Sep 2026 (02:00 WIB). Artikel BARU studiosoft.id publish 13 Sep 2026 07:42 WIB
(https://studiosoft.id/jasa-digital-marketing-klinik/) — belum pernah dipakai di akun mana pun.
Resolusi 1080x1350 (4:5). Tema: navy #0D4761 + accent sky #38BDF8. Font Poppins.
"""
from PIL import Image, ImageDraw, ImageFont
import os

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

W, H = 1080, 1350
NAVY = (18, 43, 99)          # #122B63 — BIRU TUA (perintah Bos 16 Sep 2026; arsip: (13,71,97))
SKY = (56, 189, 248)
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)


B120 = F("Poppins-Bold.ttf", 120)
B110 = F("Poppins-Bold.ttf", 110)
B100 = F("Poppins-Bold.ttf", 100)
B95 = F("Poppins-Bold.ttf", 95)
B85 = F("Poppins-Bold.ttf", 85)
B75 = F("Poppins-Bold.ttf", 75)
B50 = F("Poppins-Bold.ttf", 50)
B44 = F("Poppins-Bold.ttf", 44)
B40 = F("Poppins-Bold.ttf", 40)
B30 = F("Poppins-Bold.ttf", 30)
SB40 = F("Poppins-SemiBold.ttf", 40)
SB36 = F("Poppins-SemiBold.ttf", 36)
SB32 = F("Poppins-SemiBold.ttf", 32)
SB28 = F("Poppins-SemiBold.ttf", 28)
REG36 = F("Poppins-Regular.ttf", 36)
REG32 = F("Poppins-Regular.ttf", 32)
REG30 = F("Poppins-Regular.ttf", 30)
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.24)
    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), "%s/5" % num, 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 tick_deco(d, y):
    for i in range(6):
        dx = M + i * 30
        d.line([(dx, y), (dx + 18, y)], fill=SKY, width=3)


def new_slide():
    img = Image.new("RGB", (W, H), NAVY)
    return img, ImageDraw.Draw(img)


def slide_cover():
    img, d = new_slide()
    header_footer(d, "1", "#marketingklinik")
    d.text((M, 115), "JASA DIGITAL", font=B100, fill=WHITE)
    d.text((M, 250), "MARKETING", font=B95, fill=SKY)
    d.text((M, 385), "KLINIK", font=B110, fill=WHITE)
    tick_deco(d, 570)
    y = draw_wrapped(d, (M, 615), "Cara menarik pasien baru dari Google — tanpa janji berlebihan, dengan membangun kepercayaan.",
                     SB36, WHITE, W - 2 * M)
    draw_wrapped(d, (M, 880), "Pasien tidak mencari \"klinik terbaik\". Mereka mencari jawaban atas masalahnya. Tugas digital marketing: memastikan klinik Anda ditemukan tepat saat momen itu terjadi.",
                 REG30, WHITE, W - 2 * M)
    p = os.path.join(OUT_DIR, "01_cover.png")
    img.save(p, "PNG")
    print("OK", p)
    return p


def slide_kenapa():
    img, d = new_slide()
    header_footer(d, "2", "#marketingklinik")
    d.text((M, 80), "4 TAHAP", font=B110, fill=WHITE)
    d.text((M, 230), "PASIEN MEMILIH", font=B75, fill=SKY)

    items = [
        "1. Sadar ada masalah — \"gusi berdarah terus\", \"jerawat tak sembuh\"",
        "2. Mencari solusi — membaca artikel, membandingkan penanganan",
        "3. Cari penyedia terdekat — \"klinik X terdekat\", \"dokter Y di kota saya\"",
        "4. Memutuskan — melihat ulasan, jam buka, kemudahan membuat janji",
    ]
    y = 400
    for s in items:
        y = draw_wrapped(d, (M, y), s, SB32, WHITE, W - 2 * M - 20)
        y += 52

    tick_deco(d, 1000)
    draw_wrapped(d, (M, 1050), "Tahap 3 & 4 didominasi hasil peta (map pack). Klinik yang tidak muncul di sana kalah — meski artikelnya banyak.",
                 REG28, WHITE, W - 2 * M)
    p = os.path.join(OUT_DIR, "02_perjalanan_pasien.png")
    img.save(p, "PNG")
    print("OK", p)
    return p


def slide_strategi123():
    img, d = new_slide()
    header_footer(d, "3", "#marketingklinik")
    d.text((M, 70), "STRATEGI", font=B100, fill=WHITE)
    d.text((M, 200), "1 - 3", font=B95, fill=SKY)

    items = [
        ("1", "Konten edukasi yang menjawab",
         "Jawaban langsung di awal, langkah demi langkah, plus FAQ. Tetap dalam etika medis — tanpa janji kesembuhan."),
        ("2", "Menang di pencarian \"terdekat\"",
         "Google Business Profile lengkap, ulasan pasien yang segar, halaman layanan yang menyebut kota/kecamatan."),
        ("3", "Permudah cara menghubungi",
         "Tombol WhatsApp jelas di tiap halaman, jam praktik & jadwal dokter selalu diperbarui, balasan cepat."),
    ]
    y = 355
    for num, name, desc in items:
        d.text((M, y), num, font=B50, fill=SKY)
        yy = draw_wrapped(d, (M + 85, y - 6), name, B40, WHITE, W - M - 85 - 30)
        yy = draw_wrapped(d, (M + 85, yy), desc, REG26, WHITE, W - M - 85 - 30)
        y = yy + 68
    p = os.path.join(OUT_DIR, "03_strategi_1_3.png")
    img.save(p, "PNG")
    print("OK", p)
    return p


def slide_strategi45():
    img, d = new_slide()
    header_footer(d, "4", "#marketingklinik")
    d.text((M, 70), "STRATEGI", font=B100, fill=WHITE)
    d.text((M, 200), "4 - 5", font=B95, fill=SKY)

    items = [
        ("4", "Kredibilitas yang terlihat",
         "Profil dokter, penjelasan prosedur, testimoni (dengan izin), dan kejelasan estimasi biaya."),
        ("5", "Konten jangka panjang",
         "Panduan keluhan umum, FAQ pasien, dan penjelasan beda layanan medis vs kosmetik."),
    ]
    y = 350
    for num, name, desc in items:
        d.text((M, y), num, font=B50, fill=SKY)
        yy = draw_wrapped(d, (M + 85, y - 6), name, B40, WHITE, W - M - 85 - 30)
        yy = draw_wrapped(d, (M + 85, yy), desc, REG26, WHITE, W - M - 85 - 30)
        y = yy + 70

    y_head = 810
    d.text((M, y_head), "YANG SERING SALAH:", font=SB32, fill=SKY)
    y = y_head + 70
    for s in ["Menjanjikan hasil instan (melanggar etika & merusak kepercayaan)",
              "Mengabaikan map pack — padahal mayoritas pencarian bersifat lokal",
              "Tidak melibatkan dokter dalam peninjauan konten",
              "Membiarkan pertanyaan calon pasien tidak terjawab"]:
        y = draw_wrapped(d, (M + 10, y), "•  " + s, REG26, WHITE, W - 2 * M - 30) + 18
    p = os.path.join(OUT_DIR, "04_strategi_4_5.png")
    img.save(p, "PNG")
    print("OK", p)
    return p


def slide_cta():
    img, d = new_slide()
    header_footer(d, "5", "#marketingklinik")
    d.text((M, 110), "MULAI DARI", font=B85, fill=WHITE)
    d.text((M, 240), "PENCARIAN", font=B95, fill=SKY)
    d.text((M, 380), "LOKAL", font=B110, fill=WHITE)

    draw_wrapped(d, (M, 600), "Lengkapi Google Business Profile, kumpulkan ulasan pasien, dan bangun konten edukasi yang rutin. Kombinasi ini fondasi paling tahan lama untuk mendatangkan pasien.",
                 SB32, WHITE, W - 2 * M)

    tick_deco(d, 1010)
    d.text((M, 1060), "Perjalanan pasien & 5 strateginya dibahas lengkap di:", font=REG30, fill=WHITE)
    d.text((M, 1140), "www.studiosoft.id", font=REG36, fill=SKY)
    d.text((M, 1230), "Digital marketing untuk klinik & rumah sakit", font=REG24, fill=WHITE)
    p = os.path.join(OUT_DIR, "05_cta.png")
    img.save(p, "PNG")
    print("OK", p)
    return p


if __name__ == "__main__":
    print("StudioSoft Healthcare Carousel — hc36 Jasa Digital Marketing Klinik")
    print("=" * 55)
    paths = [slide_cover(), slide_kenapa(), slide_strategi123(), slide_strategi45(), slide_cta()]
    print("OK %d slide -> %s" % (len(paths), OUT_DIR))
