#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""PERBAIKAN LINK MATI di jadwal Threads/IG/FB StudioSoft (temuan 4 Okt 2026: 14 URL 404, 107 entri).

Aturan:
 - 6 URL rumah sakit/klinik -> langsung ke halaman LIVE yang relevan (HTTP 200 terverifikasi).
 - 8 URL seri industri -> ke artikel pengganti (artikel yang sama, slug diubah sesi profil lain),
   yang baru live sesuai tanggalnya. Jadwal yang TAYANG SEBELUM tanggal itu diarahkan ke
   /layanan/ supaya tidak menunjuk halaman yang belum ada.
 - Rekam semuanya, verifikasi baca balik dari API.

Pakai:
  python3 perbaiki_link_mati.py dry
  python3 perbaiki_link_mati.py run
"""
import json, re, sys, time, datetime, subprocess
from repliz_client import get_client

LAYANAN = "https://studiosoft.id/layanan/"

# (target, tanggal live target atau None kalau sudah live)
PETA = {
 "https://studiosoft.id/digital-marketing-bisnis-manufaktur/":
    ("https://studiosoft.id/marketing-manufaktur/", "2026-10-08"),
 "https://studiosoft.id/digital-marketing-bisnis-properti/":
    ("https://studiosoft.id/digital-marketing-properti/", "2026-10-06"),
 "https://studiosoft.id/analitik-digital-bisnis-properti/":
    ("https://studiosoft.id/analitik-properti/", "2026-10-13"),
 "https://studiosoft.id/data-marketing-bisnis-properti/":
    ("https://studiosoft.id/analitik-properti/", "2026-10-13"),
 "https://studiosoft.id/insight-media-sosial-bisnis-properti/":
    ("https://studiosoft.id/promosi-apartemen-media-sosial/", "2026-10-12"),
 "https://studiosoft.id/digital-marketing-bisnis-retail/":
    ("https://studiosoft.id/digital-marketing-retail/", "2026-10-09"),
 "https://studiosoft.id/digital-marketing-bisnis-keuangan/":
    ("https://studiosoft.id/marketing-keuangan/", "2026-10-11"),
 "https://studiosoft.id/seo-untuk-bisnis-properti/":
    ("https://studiosoft.id/seo-properti/", "2026-10-07"),
 # rumah sakit / klinik — target sudah live
 "https://studiosoft.id/iklan-facebook-rumah-sakit/":
    ("https://studiosoft.id/jasa-digital-marketing-rs/", None),
 "https://studiosoft.id/klinik-kecil-butuh-digital-marketing/":
    ("https://studiosoft.id/jasa-digital-marketing-rs/", None),
 "https://studiosoft.id/konten-edukasi-kesehatan-kepercayaan-pasien":
    ("https://studiosoft.id/seo-rumah-sakit/", None),
 "https://studiosoft.id/social-media-rumah-sakit-efektif/":
    ("https://studiosoft.id/digital-marketing-rumah-sakit-indikator/", None),
 "https://studiosoft.id/strategi-digital-marketing-rumah-sakit/":
    ("https://studiosoft.id/digital-marketing-rumah-sakit-indikator/", None),
 "https://studiosoft.id/website-rumah-sakit-gagal-pasien/":
    ("https://studiosoft.id/pembuatan-website-rumah-sakit/", None),
}


def target_untuk(mati, tgl_jadwal):
    baru, live = PETA[mati]
    if live is None or tgl_jadwal >= live:
        return baru, ("langsung" if live is None else "setelah-live")
    return LAYANAN, "fallback-sebelum-live"


def ganti(teks, mati, baru):
    if not teks:
        return teks
    pola = re.compile(re.escape(mati.rstrip("/")) + r"/?")
    return pola.sub(baru, teks)


def main():
    mode = sys.argv[1] if len(sys.argv) > 1 else "dry"
    d = json.load(open("/tmp/link_mati.json"))
    tugas, ringkas = [], {}
    for mati, v in d.items():
        if mati not in PETA:
            print("TERLEWAT (tidak ada di peta):", mati)
            continue
        for j in v["jadwal"]:
            tgl = (j["at"] or "")[:10]
            baru, ket = target_untuk(mati, tgl)
            tugas.append({"id": j["id"], "akun": j["akun"], "at": j["at"], "tipe": j["tipe"],
                          "title": j["title"], "mati": mati, "baru": baru, "ket": ket})
            ringkas[ket] = ringkas.get(ket, 0) + 1
    print("total entri:", len(tugas), "|", ringkas)
    for t in tugas:
        print(f"  {t['at'][:16]} {t['akun'][:16]:16} {t['ket']:24} -> {t['baru']}")
    if mode != "run":
        return

    c = get_client()
    ok = gagal = 0
    for t in tugas:
        doc = c.get_schedule(t["id"])
        doc = doc.get("data") or doc
        if not doc or not doc.get("id"):
            print("SKIP tidak ketemu:", t["id"]); gagal += 1; continue
        desc = doc.get("description") or ""
        desc2 = ganti(desc, t["mati"], t["baru"])
        rep = doc.get("replies") or []
        rep2 = [{**r, "text": ganti(r.get("text") or "", t["mati"], t["baru"])} for r in rep]
        if desc2 == desc and rep2 == rep:
            print("SKIP tidak ada perubahan:", t["id"]); continue
        payload = {
            "accountId": doc.get("accountId") or (doc.get("account") or {}).get("_id"),
            "title": doc.get("title") or "",
            "description": desc2,
            "topic": doc.get("topic") or "",
            "type": doc.get("type"),
            "medias": doc.get("medias") or [],
            "scheduleAt": doc.get("scheduleAt"),
            "replies": rep2,
        }
        try:
            c.update_schedule(t["id"], payload)
            ok += 1
            print(f"PUT ok {t['id']} {t['ket']} -> {t['baru']}")
        except Exception as e:
            gagal += 1
            print(f"GAGAL {t['id']}: {str(e)[:160]}")
        time.sleep(0.3)
    print(f"\nSELESAI: ok {ok} | gagal {gagal}")
    json.dump(tugas, open("perbaikan_link_mati_20261004.json", "w"), ensure_ascii=False, indent=1)


if __name__ == "__main__":
    main()
