#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""perbaiki_slide_tabel_dek_okt.py — perbaiki slide rusak di deck carousel IG SS yang dikunci
3 Okt 2026 (kunci_car10_okt.py).

Dua cacat yang ditemukan 19 Okt 2026 dari QC visual:
  a) TABEL markdown ikut tercetak jadi teks slide ("| Aspek | Agency | ... | --- |") karena
     kunci_car10_okt.bersih() tidak membuang pipa tabel;
  b) seksi sampah "Baca juga" (daftar link internal) dijadikan slide, dan bullet FAQ yang
     diawali "###" (heading markdown) ikut tercetak.

Perbaikan: slide yang rusak dirakit ULANG dari ISI ARTIKEL YANG SAMA (tabel diubah jadi butir,
seksi sampah diganti seksi lain dari artikel itu) — tanpa menambah klaim baru. JPEG ditimpa
dengan NAMA FILE SAMA, jadi URL di jadwal pending tidak berubah (tidak perlu PUT). Gate 200
dua ingress setelah render.

Pakai: python3 perbaiki_slide_tabel_dek_okt.py [--go]   (default: dry run / cuma rencana)
"""
import argparse
import datetime
import os
import subprocess
import sys

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
import ss_carousel_lib as L  # noqa: E402

IMG = os.path.join(WS, "openclaw-img")
OUT = os.path.join(WS, "ss_ig_car10_okt")
NAVY = (18, 43, 99)
WHITE = (255, 255, 255)
INGRESS = ("103.84.155.153", "103.84.155.217")
HOST = "mantapserver.tail3947bb.ts.net"
TOTAL = 10


def slide(num, tgl, tag, judul, butir):
    """judul: list baris; butir: list (nama, ket) atau str."""
    if L.warna_ke(tgl, num) == "putih":
        s = L.Slide(num, TOTAL, tag, bg=WHITE, fg=NAVY, dot_color=NAVY)
    else:
        s = L.Slide(num, TOTAL, tag, bg=NAVY, fg=WHITE)
    s.title(judul, after=32)
    pairs = [(b, "") if isinstance(b, str) else b for b in butir]
    s.bullets(pairs, name_size=32, desc_size=28, gap=24)
    return s


# (tanggal, prefix, tag, nomor slide, judul, butir)
PERBAIKAN = [
    # ── 21 Okt: seksi "Perbedaan Agency dan Freelancer" (tabel) + seksi sampah "Baca juga"
    ("2026-10-21", "ss_car10_agencypartner", "#digitalagency", 3,
     ["PERBEDAAN DIGITAL MARKETING AGENCY DAN", "FREELANCER"],
     [("Tim", "agency: lengkap dan terstruktur · freelancer: individu atau tim kecil."),
      ("Layanan", "agency: menyeluruh · freelancer: spesifik."),
      ("Skala proyek", "agency: kecil sampai besar · freelancer: umumnya kecil-menengah."),
      ("Konsistensi", "agency: lebih terjamin · freelancer: tergantung individu.")]),
    ("2026-10-21", "ss_car10_agencypartner", "#digitalagency", 7,
     ["KEUNTUNGAN BEKERJA SAMA DENGAN AGENCY", "LOKAL SURABAYA"],
     [("Paham pasar lokal", "memahami karakter konsumen dan budaya bisnis Surabaya."),
      ("Komunikasi langsung", "mudah bertemu dan berdiskusi secara tatap muka."),
      ("Respons cepat", "tim di kota yang sama merespons lebih cepat."),
      ("Dukungan berkelanjutan", "koordinasi maintenance dan update jadi lebih gampang.")]),
    # ── 28 Okt: langkah bernomor yang terpotong, FAQ ber-"###", seksi sampah "Baca juga"
    ("2026-10-28", "ss_car10_kelolaakun", "#kelolasosmed", 4,
     ["CARA KERJA AI PERSONAL ASSISTANT", "MENGELOLA BANYAK AKUN"],
     [("Buat agent per akun", "tiap agent punya nama, gaya bicara, topik, dan batasan etika sendiri."),
      ("Jadwalkan per platform", "jam aktif dan format unggahan tiap kanal berbeda, diatur otomatis."),
      ("Autoreply dengan filter", "AI memilah pertanyaan serius, pujian, dan spam sebelum membalas.")]),
    ("2026-10-28", "ss_car10_kelolaakun", "#kelolasosmed", 7,
     ["FAQ"],
     [("Bisa menggantikan admin?", "pekerjaan repetitif ya, tapi peran strategis tetap di tangan manusia."),
      ("Berapa biayanya?", "tergantung jumlah akun dan platform; untuk bisnis kecil lebih murah dari beberapa admin."),
      ("Aman memberi akses akun?", "aman selama akses dibatasi, aktivitas tercatat, dan manusia memegang kendali.")]),
    ("2026-10-28", "ss_car10_kelolaakun", "#kelolasosmed", 9,
     ["CARA KERJA", "(LANJUTAN)"],
     [("Cross-mention antar akun", "akun terkait bisa saling menyebut secara natural untuk memperluas jangkauan."),
      ("Pantau dan lapor otomatis", "AI merangkum performa tiap akun; manusia membaca laporan lalu memberi arahan."),
      ("Berjalan terus", "tanpa jam kerja dan tanpa akun yang terlupakan.")]),
    # ── 29 Okt: tabel pertanyaan + FAQ ber-"###"
    ("2026-10-29", "ss_car10_pilihseo", "#jasaseo", 5,
     ["PERTANYAAN YANG HARUS DIAJUKAN KE", "JASA SEO"],
     [("Berapa lama hasil terlihat?", "SEO yang sehat butuh 3–6 bulan, bukan seminggu."),
      ("Apa strateginya?", "pastikan white hat, bukan teknik berisiko."),
      ("Bagaimana laporan progress?", "transparansi berarti hasilnya bisa diaudit."),
      ("Keyword apa yang ditargetkan?", "harus relevan dengan bisnis Anda, bukan sekadar kata ramai.")]),
    ("2026-10-29", "ss_car10_pilihseo", "#jasaseo", 7,
     ["FAQ"],
     [("Biaya jasa SEO?", "umumnya Rp1,5 juta sampai Rp15 juta per bulan, tergantung keyword dan cakupan."),
      ("Berapa lama hasilnya?", "hasil signifikan biasanya 3–6 bulan; keyword lokal bisa lebih cepat."),
      ("Jaminan peringkat 1?", "tidak masuk akal — penyedia jujur menjanjikan strategi, bukan jaminan mutlak.")]),
]


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


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--go", action="store_true")
    ap.add_argument("--tanggal", default=None)
    a = ap.parse_args()
    from PIL import Image
    for tgl_s, prefix, tag, num, judul, butir in PERBAIKAN:
        if a.tanggal and tgl_s != a.tanggal:
            continue
        tgl = datetime.date.fromisoformat(tgl_s)
        s = slide(num, tgl, tag, judul, butir)
        print(f"{tgl_s} {prefix} slide {num}: {judul} — {len(butir)} butir")
        if not a.go:
            continue
        png = s.render(f"{prefix}_{num:02d}.png", OUT, quiet=True)
        im = Image.open(png).convert("RGB")
        assert im.size == (1080, 1350), im.size
        jpg = os.path.join(IMG, f"{prefix}_{num:02d}.jpg")
        im.save(jpg, "JPEG", quality=85, optimize=True)
        print(f"    -> {jpg} ({os.path.getsize(jpg)} B) sudut={im.getpixel((8, 8))}")
        print("    gate:", "OK" if gate(f"{prefix}_{num:02d}.jpg") else "GAGAL")


if __name__ == "__main__":
    main()
