#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""_fix_seomalang_10okt.py — perbaiki 2 cacat deck carousel feed IG SS 10 Okt 2026 (ss_car10_seomalang):

  1. slide 01 (cover): lead/para berisi teks MENU situs yang bocor dari r.jina.ai
     ("Skip to content Beranda Tentang Layanan … WhatsApp") — diganti kalimat asli artikel.
  2. slide 07 (FAQ): butir pertama masih memuat penanda markdown "###" — dibersihkan.

File lama DIARSIPKAN (bukan dihapus). Media JPEG q85 disimpan dengan nama/URL yang SAMA
(ss_car10_seomalang_01.jpg / _07.jpg) → jadwal album `pending` yang sudah ada otomatis ikut versi baru.
Story mirror 08:40 memakai kanvas slide 01 → kanvas diregenerasi paksa.

Pakai:  python3 _fix_seomalang_10okt.py            (dry run: render ke /tmp, tidak menyentuh media)
        python3 _fix_seomalang_10okt.py --go
"""
import argparse
import datetime
import os
import re
import shutil
import subprocess
import sys

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
IMG = os.path.join(WS, "openclaw-img")
OUT = os.path.join(WS, "ss_ig_car10_okt")
ARSIP = os.path.join(WS, "arsip", "seomalang_10okt_sebelum_fix")
TGL = "2026-10-10"
SLUG = "jasa-seo-malang"
PFX = "ss_car10_seomalang"
TAG = "#seomalang"
TOTAL = 10
NAVY = (18, 43, 99)
WHITE = (255, 255, 255)

sys.path.insert(0, WS)
import ss_carousel_lib as L  # noqa: E402
import pasang_car_generik as PG  # noqa: E402
import kunci_car10_okt as K  # noqa: E402

JUNK_NAV = re.compile(r"skip to content|beranda|layanan jasa|whatsapp|hubungi|tentang layanan|"
                      r"social media|web development|artikel digital|baca juga|lihat juga", re.I)


def mk(num, tgl):
    if L.warna_ke(tgl, num) == "putih":
        return L.Slide(num, TOTAL, TAG, bg=WHITE, fg=NAVY, dot_color=NAVY), L.AKSEN_PUTIH
    return L.Slide(num, TOTAL, TAG, bg=NAVY, fg=WHITE), L.SKY


def gate(nama):
    for ip in PG.INGRESS:
        code = subprocess.run(["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "30",
                               "--resolve", f"{PG.HOST}:443:{ip}",
                               f"https://{PG.HOST}/openclaw-img/{nama}"],
                              capture_output=True, text=True).stdout.strip()
        if code != "200":
            return f"GATE {nama} ip {ip} → {code}"
    return None


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--go", action="store_true")
    a = ap.parse_args()
    tgl = datetime.date.fromisoformat(TGL)

    art = K.parse_artikel(SLUG)
    if not art:
        print("⛔ teks artikel gagal dibaca"); return
    intro_k = [s for s in K.kalimat(art["intro"]) if not JUNK_NAV.search(s)]
    if len(intro_k) < 1:
        print("⛔ intro bersih tidak ada"); return
    print("intro bersih:", intro_k)
    print("judul       :", art["judul"])

    # ── slide 01 baru (cover bersih) ─────────────────────────────────────────
    tmp = "/tmp/fix_seomalang"
    os.makedirs(tmp, exist_ok=True)
    lead = intro_k[0]
    para = intro_k[1] if len(intro_k) > 1 else None
    if para is None and art["seksi"]:                      # isi kalau intro cuma 1 kalimat bersih
        for k in K.kalimat(art["seksi"][0][1]):
            if len(k) >= 60 and not JUNK_NAV.search(k):
                para = k
                break
    s, ac = mk(1, tgl)
    judul_baris = K.baris_judul(art["judul"])
    s.title([(judul_baris[0], ac)] + judul_baris[1:], after=40)
    s.lead(lead, after=26)
    if para:
        s.para(para, size=29)
    p01 = s.render(f"{PFX}_01.png", tmp, quiet=True)
    print("cover lead:", lead)
    print("cover para:", para)

    # ── slide 07 baru (buang "###") ─────────────────────────────────────────
    seksi = art["seksi"]
    isi_seksi = [(h, K.kalimat(i)) for h, i in seksi]
    n_butir = 4 if len(isi_seksi) <= 6 else 3
    unit = [(h, ks[:n_butir], ks[n_butir:]) for h, ks in isi_seksi]
    pilih = [(h, ks) for h, ks, _ in unit]
    if len(pilih) < 8:
        tambah, urut_sisa = {}, sorted(range(len(unit)), key=lambda i: -len(unit[i][2]))
        for i in urut_sisa:
            if len(pilih) + len(tambah) >= 8:
                break
            if len(unit[i][2]) >= 2:
                tambah[i] = unit[i][2][:n_butir]
        pilih = []
        for i, (h, ks, sisa) in enumerate(unit):
            pilih.append((h, ks))
            if i in tambah:
                pilih.append((h + " (lanjutan)", tambah[i]))
    isi_slides = pilih[:8]
    head7, ks7 = isi_slides[5]          # slide 07 = isi ke-6
    ks7 = [re.sub(r"^#{1,6}\s*", "", k).strip() for k in ks7]
    print("slide 07 head:", head7)
    for k in ks7:
        print("   -", k[:90])
    s7, ac7 = mk(7, tgl)
    s7.title(K.baris_judul(head7, maks_kata=5), after=32)
    s7.bullets([(k, "") for k in ks7[:3]], name_size=32, desc_size=28, gap=24)
    p07 = s7.render(f"{PFX}_07.png", tmp, quiet=True)

    # ── simpan ───────────────────────────────────────────────────────────────
    from PIL import Image
    for berkas, png in ((f"{PFX}_01.jpg", p01), (f"{PFX}_07.jpg", p07)):
        im = Image.open(png).convert("RGB")
        assert im.size == (1080, 1350), f"{png} {im.size}"
        if not a.go:
            im.save(os.path.join(tmp, berkas), "JPEG", quality=85, optimize=True)
            print(f"dry: {berkas} siap ({os.path.getsize(os.path.join(tmp, berkas))//1024} KB)")
            continue
        os.makedirs(ARSIP, exist_ok=True)
        dst = os.path.join(IMG, berkas)
        if os.path.exists(dst):
            shutil.copy2(dst, os.path.join(ARSIP, berkas))
        im.save(dst, "JPEG", quality=85, optimize=True)
        shutil.copy2(png, os.path.join(ARSIP, os.path.basename(png)) + ".baru")
        print(f"✅ {berkas} diganti ({os.path.getsize(dst)//1024} KB) · backup di {ARSIP}")

    if not a.go:
        print("dry run selesai — jalankan --go untuk menulis ke openclaw-img/")
        print("preview:", p01, p07)
        return

    # ── gate 200 dua ingress ────────────────────────────────────────────────
    masalah = [m for m in (gate(f"{PFX}_01.jpg"), gate(f"{PFX}_07.jpg")) if m]
    if masalah:
        print("⛔", masalah); return
    print("✅ gate 200 dua ingress: _01 dan _07")

    # ── kanvas story slide 01 (WAJIB, 1080x1920) ────────────────────────────
    nama_kanvas = f"ss_story_canvas_{PFX}_01.jpg"
    jalur_kanvas = os.path.join(IMG, nama_kanvas)
    if os.path.exists(jalur_kanvas):
        shutil.copy2(jalur_kanvas, os.path.join(ARSIP, nama_kanvas))
        os.remove(jalur_kanvas)
    nama = PG.kanvas_story(f"{PFX}_01.jpg")
    if nama != nama_kanvas:
        print("⛔ kanvas story tak sesuai:", nama); return
    im = Image.open(jalur_kanvas)
    print(f"✅ kanvas story dibuat: {nama} {im.size}")
    masalah = gate(nama_kanvas)
    print("gate kanvas:", "✅ 200 dua ingress" if not masalah else f"⛔ {masalah}")


if __name__ == "__main__":
    main()
