#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Tambahkan identitas klinik (dokter spesialis DVE + klinik estetika) ke caption semua carousel TSC,
lalu perbarui jadwal yang sudah terpasang.

Jalankan:
    python3 tsc_perbarui_caption.py            # dry run: lihat perubahan
    python3 tsc_perbarui_caption.py --run       # tulis modul + update jadwal Repliz
"""
import datetime as dt
import importlib
import pprint
import re
import sys

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from repliz_client import get_client  # noqa: E402

MODUL = (["bekas_jerawat_cekung", "jerawat_hormonal", "kulit_sensitif"]
         + [f"tsc_topik{d}" for d in range(18, 32)])
AKUN = {"6a86a7e062caae1e04ff8244": ("IG", "caption_ig"),
        "6a4bbc5920e4f4f195e52960": ("Threads", "caption_threads"),
        "6a3b41ddc5ff4ce3a327542c": ("FB", "caption_ig"),
        "6a4da7f520e4f4f195e796e1": ("LinkedIn", "caption_linkedin")}

IDENT = {
    "caption_ig": "The Skin Code Clinic Krian, Sidoarjo — edukasi kulit & estetika dari dokter spesialis DVE "
                  "(dermatologi, venereologi, estetika). Buka setiap hari 09.00–19.00.",
    "caption_linkedin": "The Skin Code Clinic Krian, Sidoarjo. Pemeriksaan dan tindakan estetika dilakukan "
                        "dokter spesialis DVE (dermatologi, venereologi, estetika). Buka setiap hari 09.00–19.00.",
    "caption_threads": "Klinik kulit & estetika Krian Sidoarjo, dokter Sp.DVE. Buka tiap hari 09.00–19.00.",
}
PENANDA = "dokter spesialis DVE"
KUNCI_CAPTION = ("caption_ig", "caption_threads", "caption_linkedin")


def sisipkan(cap, baris):
    """Taruh baris identitas sebelum baris ajakan WhatsApp."""
    if PENANDA in cap:
        return cap
    for patokan in ("📲 Konsultasi", "Konsultasi & booking", "WA 0851"):
        if patokan in cap:
            kepala, ekor = cap.split(patokan, 1)
            return kepala.rstrip() + "\n\n" + baris + "\n\n" + patokan + ekor
    return cap.rstrip() + "\n\n" + baris


def pangkas_threads(cap, maks=480):
    if len(cap) <= maks:
        return cap
    bagian = cap.split("\n\n")
    while len("\n\n".join(bagian)) > maks:
        kandidat = [i for i, b in enumerate(bagian) if b.lstrip().startswith("•")]
        if not kandidat:
            break
        bagian.pop(max(kandidat, key=lambda k: len(bagian[k])))
    out = "\n\n".join(bagian)
    if len(out) > maks and len(bagian) > 1:
        kal = re.split(r"(?<=[.!?])\s+", bagian[1])
        while len("\n\n".join(bagian)) > maks and len(kal) > 1:
            kal.pop()
            bagian[1] = " ".join(kal)
        out = "\n\n".join(bagian)
    if len(out) > maks:
        out = out[:maks].rsplit("\n", 1)[0].rstrip()
    return out


def main():
    mode = "run" if "--run" in sys.argv else "dry"
    semua = {}
    for nama in MODUL:
        mod = importlib.import_module(nama)
        slug, data = next(iter(mod.CAROUSEL.items()))
        berubah = False
        for kunci in KUNCI_CAPTION:
            lama = data.get(kunci) or ""
            baru = sisipkan(lama, IDENT[kunci])
            if kunci == "caption_threads":
                baru = pangkas_threads(baru)
            if baru != lama:
                data[kunci] = baru
                berubah = True
                print(f"  {nama} [{kunci}] {len(lama)} → {len(baru)} char")
        if berubah and mode == "run":
            isi = ("#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n"
                   "\"\"\"Caption carousel TSC — sudah memuat identitas klinik (dokter Sp.DVE).\"\"\"\n\n"
                   "CAROUSEL = " + pprint.pformat({slug: data}, width=120, sort_dicts=False) + "\n")
            with open(f"{WS}/{nama}.py", "w", encoding="utf-8") as f:
                f.write(isi)
        semua.update({slug: data})
    print(f"\nmodul diperiksa: {len(MODUL)} | mode: {mode}")

    if mode != "run":
        return

    # ── perbarui jadwal yang sudah terpasang ──
    c = get_client()
    docs, page = [], 1
    while page <= 60:
        d = c.get_schedules(page=page, limit=50)
        items = d.get("docs") or d.get("data") or d.get("items") or []
        if not items:
            break
        docs += items
        if len(items) < 50:
            break
        page += 1

    WIB = dt.timezone(dt.timedelta(hours=7))
    diubah = 0
    for it in docs:
        acc = it.get("accountId")
        if acc not in AKUN:
            continue
        med = it.get("medias") or []
        if isinstance(med, dict):
            med = [med]
        nama_media = " ".join((m.get("url") or "") for m in med)
        m = re.search(r"tsc_car3_([a-z0-9]+)_", nama_media)
        if not m:
            continue
        kode = m.group(1)
        data = next((d for d in semua.values() if d["kode"] == kode), None)
        if not data:
            continue
        kanal, kunci = AKUN[acc]
        caption = data[kunci]
        if (it.get("description") or "").strip() == caption.strip():
            continue
        c.update_schedule(it["_id"], {"description": caption})
        diubah += 1
        tgl = dt.datetime.fromisoformat(str(it.get("scheduleAt")).replace("Z", "+00:00")).astimezone(WIB)
        print(f"   ↻ {tgl.strftime('%d %b %H:%M')} {kanal:8s} {kode} caption diperbarui")
    print(f"\njadwal diperbarui: {diubah}")


if __name__ == "__main__":
    main()
