#!/usr/bin/env python3
"""Konsolidasi konten DAS: gabungkan bagian unik artikel tumpang tindih ke halaman utama,
lalu pensiunkan (draft). Dry run default; --apply untuk eksekusi."""
import base64, html, json, os, re, sys, urllib.request, urllib.error

SITE = "https://dasindonesia.com"
AUTH = base64.b64encode(b"bambangbot:u3a1 G2pQ 3SWY f0zI OlGP YAjU").decode()
WS = os.path.dirname(os.path.abspath(__file__))

# sumber -> halaman utama (isi unik sumber dipindah ke utama, lalu sumber dipensiunkan)
MERGE = {
    8059: 5569,   # biaya & proses overhaul Alphard -> Bengkel Spesialis Alphard Surabaya
    8065: 5569,   # servis rutin Alphard -> idem
    8057: 6304,   # bengkel mobil Alphard -> Bengkel Mobil Alphard Surabaya
    8055: 8051,   # rekomendasi bengkel premium -> bengkel mobil mewah
    8049: 8051,   # bengkel premium terbaik -> idem
    7969: 8079,   # Honda overhaul -> gejala mesin Honda perlu overhaul
    8162: 7810,   # pentingnya overhaul -> kapan mobil perlu overhaul
    8166: 7810,   # biaya menunda overhaul -> idem
    8169: 7810,   # overhaul dini vs darurat -> idem
    8213: 5619,   # Fortuner servis berkala -> Bengkel Spesialis Fortuner
    8214: 5619,   # Fortuner overhaul diesel -> idem
    6878: 6887,   # bengkel overhaul terbaik -> bengkel overhaul mobil Surabaya
    6957: 7812,   # tips merawat mobil semua merek -> cara merawat mesin mobil
    6796: 6791,   # servis sebelum liburan -> tips persiapkan mobil liburan
    6692: 6675,   # perawatan musim hujan -> langkah aman musim hujan
    6679: 7038,   # perawatan aki musim hujan -> tips merawat aki
    6411: 6784,   # pick up service promo -> layanan pickup & delivery
    6772: 5684,   # perawatan mobil Lexus (tipis) -> Bengkel Spesialis Lexus Surabaya
}

# pensiun langsung: tipis, generik, duplikat, atau di luar tema
RETIRE = [5584, 6382, 7611, 7608, 5588, 5445, 5453, 5451, 5447, 5441, 5439, 5437,
          5433, 5431, 5429, 5426, 5338]


def api(path, data=None, method=None):
    method = method or ("POST" if data is not None else "GET")
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(SITE + path, data=body, headers=h, method=method)
    try:
        with urllib.request.urlopen(r, timeout=240) as x:
            return x.status, json.loads(x.read())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode()[:200]


def ambil(pid):
    st, p = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,slug,title,content,status")
    return p if isinstance(p, dict) else None


def seksi(raw):
    """Pecah konten jadi blok per <h2>…</h2> berikut isinya."""
    idx = [m.start() for m in re.finditer(r"<h2[^>]*>", raw, re.I)]
    if not idx:
        return []
    idx.append(len(raw))
    out = []
    for i in range(len(idx) - 1):
        blok = raw[idx[i]:idx[i + 1]]
        jud = re.search(r"<h2[^>]*>(.*?)</h2>", blok, re.S | re.I)
        out.append((html.unescape(re.sub("<[^>]+>", "", jud.group(1))).strip() if jud else "", blok.strip()))
    return out


apply_ = "--apply" in sys.argv
laporan = []
print("=== RENCANA GABUNG ===")
for src, dst in sorted(MERGE.items()):
    s, d = ambil(src), ambil(dst)
    if not s or not d:
        print(f"  #{src} -> #{dst}: GAGAL ambil konten")
        continue
    judul_d = {h.lower() for h, _ in seksi(d["content"]["raw"])}
    kandidat = [(h, b) for h, b in seksi(s["content"]["raw"])
                if h and h.lower() not in judul_d and not re.search(r"faq|kesimpulan|baca juga", h, re.I)]
    pilih = kandidat[:2]
    print(f"  #{src} {s['title']['rendered'][:44]:<46} -> #{dst} {d['title']['rendered'][:30]}")
    for h, _ in pilih:
        print(f"        + {h[:70]}")
    laporan.append({"src": src, "dst": dst, "judul_src": s["title"]["rendered"], "judul_dst": d["title"]["rendered"],
                    "bagian": [h for h, _ in pilih], "slug_src": s["slug"], "status_src": s["status"]})
    if apply_ and pilih:
        blok = "\n".join(b for _, b in pilih)
        raw_d = d["content"]["raw"]
        m = re.search(r"\n<h2[^>]*>\s*(FAQ|Kesimpulan)", raw_d, re.I)
        baru = (raw_d[:m.start()] + "\n" + blok + "\n" + raw_d[m.start():]) if m else (raw_d.rstrip() + "\n" + blok + "\n")
        st1, _ = api(f"/wp-json/wp/v2/posts/{dst}", {"content": baru})
        st2, _ = api(f"/wp-json/wp/v2/posts/{src}", {"status": "draft"})
        st3, chk = api(f"/wp-json/wp/v2/posts/{dst}?context=edit&_fields=content")
        naik = len(chk["content"]["raw"]) > len(raw_d) if isinstance(chk, dict) else False
        print(f"        gabung: {'OK' if naik else 'GAGAL'} | pensiun #{src}: {'draft' if st2 == 200 else st2}")

print("\n=== RENCANA PENSIUN LANGSUNG ===")
for pid in RETIRE:
    p = ambil(pid)
    if p:
        print(f"  #{pid} {p['title']['rendered'][:66]}")
        laporan.append({"src": pid, "dst": None, "judul_src": p["title"]["rendered"], "slug_src": p["slug"], "status_src": p["status"]})
        if apply_:
            st, _ = api(f"/wp-json/wp/v2/posts/{pid}", {"status": "draft"})
            print(f"        pensiun: {'draft' if st == 200 else st}")

json.dump(laporan, open(os.path.join(WS, "das_konsolidasi_laporan.json"), "w"), indent=1, ensure_ascii=False)
print(f"\ntotal disentuh: {len(MERGE)} gabung + {len(RETIRE)} pensiun = {len(MERGE)+len(RETIRE)} artikel")
if not apply_:
    print("(dry run — pakai --apply untuk eksekusi)")
