#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Generator kartu Threads DAS (1080x1350) — gaya resmi DAS.

Gaya: bg navy #1a1a2e, aksen oranye #f97316, Poppins, header "DAS BENGKEL INDONESIA",
footer www.dasindonesia.com. Sama dengan poster FB DAS (gen_das_fb_*.py), tapi:
  - tinggi blok konten diukur otomatis (2-6 poin), jadi tidak ada ruang kosong besar
  - ada sanity check lebar teks: kalau ada yang lewat 950px -> OVERFLOW (gagal render)

Pakai: python3 gen_das_kartu.py            # render semua dek ke openclaw-img/
       python3 gen_das_kartu.py --list     # cetak daftar dek saja
"""
import os, sys
from PIL import Image, ImageDraw, ImageFont

W, H = 1080, 1350
BG = (26, 26, 46)
TXT = (255, 255, 255)
ORANGE = (249, 115, 22)
MUTED = (200, 200, 210)
SZ = 65
MAXW = W - 2 * SZ

FONT_PATHS = [
    "/home/mantapman/.fonts/Poppins-Bold.ttf",
    "/home/mantapman/.fonts/Poppins-SemiBold.ttf",
    "/home/mantapman/.fonts/Poppins-Regular.ttf",
    "/home/mantapman/.fonts/poppins/Poppins-Bold.ttf",
    "/home/mantapman/.fonts/poppins/Poppins-Regular.ttf",
    "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
    "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
]

# ── Dek: tiap kartu = judul 2 baris + subtitle + 3-6 poin (label, keterangan) ──
DEK = [
{
 "nama": "das_kartu_rem_01",
 "kicker": "SERVIS MOBIL",
 "judul": ["6 TANDA KAMPAS REM", "SUDAH MENIPIS"],
 "sub": "Cek sebelum berdecit jadi berdecit terus",
 "poin": [
    ("Bunyi berdecit saat mengerem", "Pelat pengingat di kampas sudah menyentuh cakram"),
    ("Pedal terasa makin dalam", "Bisa kampas, bisa juga minyak rem"),
    ("Mobil menepi saat mengerem", "Satu sisi menahan lebih kuat"),
    ("Setir bergetar waktu mengerem", "Arahnya ke cakram yang tidak rata"),
    ("Kampas keluar serbuk hitam", "Keausan makin cepat"),
    ("Sudah lewat 40.000 km", "Belum tentu habis, tapi wajib diperiksa"),
 ],
},
{
 "nama": "das_kartu_balancing_02",
 "kicker": "KAKI-KAKI",
 "judul": ["SETIR BERGETAR?", "INI BEDANYA"],
 "sub": "Balancing dan spooring bukan hal yang sama",
 "poin": [
    ("Balancing", "Menyeimbangkan putaran roda, satuannya gram"),
    ("Spooring", "Mengatur sudut roda, satuannya derajat"),
    ("Getar di kecepatan tinggi", "Biasanya balancing"),
    ("Ban aus sebelah", "Biasanya sudut roda"),
    ("Getar hanya saat mengerem", "Bukan keduanya — curigai cakram"),
 ],
},
{
 "nama": "das_kartu_kebiasaan_03",
 "kicker": "PERAWATAN MOBIL",
 "judul": ["5 KEBIASAAN YANG", "BIKIN MOBIL CEPAT RUSAK"],
 "sub": "Semuanya terlihat sepele di awal",
 "poin": [
    ("Menunda ganti oli", "Oli menua walau mobil jarang dipakai"),
    ("Membiarkan bunyi kecil", "Yang murah jadi mahal kalau dibiarkan"),
    ("Cek tekanan ban asal-asalan", "Ban dan kaki-kaki kena dua-duanya"),
    ("Mobil lama diam di garasi", "Aki tekor, seal mengering"),
    ("Isi freon tanpa cari bocornya", "Biangnya tidak pernah selesai"),
 ],
},
]


def font(sz, bold=True):
    for p in FONT_PATHS:
        if ("Bold" in p) == bold and os.path.exists(p):
            try:
                return ImageFont.truetype(p, sz)
            except Exception:
                continue
    for p in FONT_PATHS:
        if os.path.exists(p):
            try:
                return ImageFont.truetype(p, sz)
            except Exception:
                continue
    return ImageFont.load_default()


def fit_font(text, max_w, start=82):
    sz = start
    while sz > 40:
        f = font(sz, True)
        if f.getlength(text) <= max_w:
            return f, sz
        sz -= 2
    return font(40, True), 40


def draw_check(d, x, cy, size, fill):
    s = size
    d.line([(x, cy + s * 0.52), (x + s * 0.32, cy + s * 0.92), (x + s, cy + s * 0.08)],
           fill=fill, width=max(5, int(s * 0.16)), joint="curve")


def render(dek, keluar="openclaw-img"):
    img = Image.new("RGB", (W, H), BG)
    d = ImageDraw.Draw(img)
    masalah = []

    # header
    d.text((SZ, SZ), "DAS BENGKEL INDONESIA", font=font(34, True), fill=ORANGE)
    d.text((W - SZ, SZ), dek["kicker"], font=font(30, True), fill=TXT, anchor="ra")
    d.line([(SZ, SZ + 70), (W - SZ, SZ + 70)], fill=ORANGE, width=4)

    # judul
    s1 = fit_font(dek["judul"][0], MAXW)[1]
    s2 = fit_font(dek["judul"][1], MAXW)[1]
    tsz = min(s1, s2)
    ftitle = font(tsz, True)
    lh = int(tsz * 1.22)
    ty = 186
    for i, baris in enumerate(dek["judul"]):
        d.text((SZ, ty + i * lh), baris, font=ftitle, fill=TXT)

    # subtitle + divider
    sy = ty + len(dek["judul"]) * lh + 32
    d.text((SZ, sy), dek["sub"], font=font(35, True), fill=ORANGE)
    dy = sy + 66
    d.line([(SZ, dy), (SZ + 180, dy)], fill=ORANGE, width=5)

    # poin: tinggi baris dihitung supaya blok pas antara divider dan footer
    # (putaran QC 1: deck 5 poin menyisakan rongga besar sebelum footer)
    atas, bawah = dy + 40, H - 150
    n = len(dek["poin"])
    langit = bawah - atas
    step = min(200 if n <= 4 else 140, max(96, langit // n))
    y = atas + max(0, (langit - step * n) // 2)
    for label, ket in dek["poin"]:
        draw_check(d, SZ + 2, y + 2, 30, ORANGE)
        fl, sl = font(32, True), font(24, False)
        if fl.getlength(label) > MAXW - 54:
            masalah.append(f"label lewat lebar: {label}")
        if sl.getlength(ket) > MAXW - 54:
            masalah.append(f"keterangan lewat lebar: {ket}")
        d.text((SZ + 54, y), label, font=fl, fill=TXT)
        d.text((SZ + 54, y + 44), ket, font=sl, fill=MUTED)
        y += step
    bawah_teks = y - step + 44 + 30
    if bawah_teks > H - 130:
        masalah.append(f"teks terakhir ({bawah_teks}) melewati footer ({H - 130})")

    # footer
    d.line([(SZ, H - 120), (W - SZ, H - 120)], fill=(70, 70, 100), width=3)
    d.text((SZ, H - 98), "www.dasindonesia.com", font=font(30, True), fill=ORANGE)
    d.text((W - SZ, H - 98), "bengkel mobil surabaya", font=font(28, True), fill=TXT, anchor="ra")

    out = os.path.join(keluar, dek["nama"] + ".jpg")
    img.save(out, quality=90)
    return out, img.size, masalah


def main():
    if "--list" in sys.argv:
        for dek in DEK:
            print(dek["nama"], "|", " / ".join(dek["judul"]), "|", len(dek["poin"]), "poin")
        return
    os.makedirs("openclaw-img", exist_ok=True)
    total = 0
    for dek in DEK:
        out, size, masalah = render(dek)
        total += len(masalah)
        print(f"{out} {size} {'✅' if not masalah else '❌ ' + '; '.join(masalah)}")
    print("selesai | masalah:", total)


if __name__ == "__main__":
    main()
