#!/usr/bin/env python3
"""DAS: (1) sisir pola nomor telepon gaya apa pun di seluruh konten, (2) ganti nomor contoh jadi nomor asli."""
import base64, json, os, re, sys, time, urllib.request, urllib.error, importlib.util

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_das", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
CFG = m.CFG
DOM, AUTH = CFG["domain"], base64.b64encode(f'{CFG["user"]}:{CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BENAR = "6285242380789"
BACKUP = f"{WS}/das_pemulihan/nomor"
os.makedirs(BACKUP, exist_ok=True)

# pola nomor telepon Indonesia — wajib berawalan 0 atau +62 (supaya ID/angka lain tidak ikut tertangkap)
POLA = [r"(?<![\d])(?:0|\+62|62)[\s\-]?8\d{1,3}[\s\-\.]?\d{3,4}[\s\-\.]?\d{3,5}(?![\d])"]
BOLEH = {BENAR, "085242380789", "0852-4238-0789", "0852 4238 0789", "+6285242380789", "62 852 4238 0789"}


def rapikan(s):
    s = re.sub(r"[^\d]", "", s)
    if s.startswith("0"):
        s = "62" + s[1:]
    if s.startswith("8"):
        s = "62" + s
    return s


def rest(p, method="GET", data=None):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    body = None
    if data is not None:
        body = json.dumps(data).encode(); h["Content-Type"] = "application/json"
    r = urllib.request.Request(f"https://{DOM}{p}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:200]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


def tarik(jenis):
    hasil, page = [], 1
    while True:
        st, d = rest(f"/wp-json/wp/v2/{jenis}?per_page=100&page={page}&status=publish&context=edit&_fields=id,slug,link,content")
        if not isinstance(d, list):
            break
        hasil += d
        if len(d) < 100:
            break
        page += 1
    return hasil


print("=== 1. sisir semua pola nomor di konten ===")
rencana = []
for jenis in ("posts", "pages"):
    for p in tarik(jenis):
        raw = p.get("content", {}).get("raw", "") or ""
        aneh = []
        for pola in POLA:
            for mm in re.finditer(pola, raw):
                teks_asli = mm.group(0)
                if teks_asli.strip() in BOLEH or rapikan(teks_asli) == BENAR:
                    continue
                aneh.append(teks_asli.strip())
        if aneh:
            rencana.append({"jenis": jenis, "id": p["id"], "slug": p["slug"], "raw": raw,
                            "aneh": sorted(set(aneh))})
            print(f"   {jenis[:-1]:<6} #{p['id']:>5} /{p['slug'][:44]:<46} {sorted(set(aneh))}")

if not rencana:
    print("   tidak ada nomor asing ✅")
    sys.exit(0)

if "--apply" not in sys.argv:
    print(f"\n{len(rencana)} dokumen perlu dibetulkan (dry run)")
    sys.exit(0)

print(f"\n=== 2. membetulkan {len(rencana)} dokumen ===")
GANTI = {"0812-3456-7890": "0852-4238-0789", "081234567890": "085242380789",
         "+62 812-3456-7890": "+62 852-4238-0789"}
for r in rencana:
    if r["jenis"] == "pages":
        print(f"   #{r['id']} HALAMAN → tidak saya tulis (wilayah Bos), hanya dilaporkan")
        continue
    p = rest(f"/wp-json/wp/v2/{r['jenis']}/{r['id']}?context=edit&_fields=id,content")[1]
    raw = p["content"]["raw"]
    open(f"{BACKUP}/{r['jenis']}_{r['id']}.txt", "w").write(raw)
    baru = raw
    for pola in POLA:
        def ganti(mm):
            t = mm.group(0)
            if t.strip() in BOLEH or rapikan(t) == BENAR:
                return t
            return GANTI.get(t.strip(), "0852-4238-0789")
        baru = re.sub(pola, ganti, baru)
    rest(f"/wp-json/wp/v2/{r['jenis']}/{r['id']}", "POST", {"content": baru})
    _, cek = rest(f"/wp-json/wp/v2/{r['jenis']}/{r['id']}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    sisa = [t for t in r["aneh"] if t in raw2]
    print(f"   #{r['id']} selesai | sisa nomor asing: {sisa or 'tidak ada'} | cocok: {'✅' if raw2 == baru else '⚠️'}")
