#!/usr/bin/env python3
"""TSC: FINAL — seragamkan semua tautan WA ke bentuk bersih + teks yang benar:
   https://wa.me/6285194936363?text=Saya%20ingin%20konsultasi%20masalah%20kulit%20di%20The%20Skin%20Code%20Clinic
Mengganti tautan bentuk apa pun (api.whatsapp.com atau wa.me, nomor apa pun).
Salinan disimpan dulu. Jalankan --apply."""
import base64, html, json, os, re, sys, time, urllib.request, urllib.error, importlib.util
from collections import Counter

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

TARGET = ("https://wa.me/6285194936363?text=Saya%20ingin%20konsultasi%20masalah%20kulit"
          "%20di%20The%20Skin%20Code%20Clinic")
POLA = re.compile(r'href="([^"]*(?:api\.whatsapp\.com|wa\.me)[^"]*)"')


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 json.loads(x.read())
        except urllib.error.HTTPError as e:
            return {"__err": e.code}
        except Exception:
            time.sleep(4)
    return {}


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

akan = []
for p in posts:
    raw = p.get("content", {}).get("raw", "")
    if POLA.search(raw):
        akan.append(p["id"])
print(f"artikel dengan tautan WA: {len(akan)} dari {len(posts)}")
print(f"target: {TARGET}")

if "--apply" not in sys.argv:
    print("\n(dry run — pakai --apply)")
    sys.exit(0)

print("\n=== menulis ===")
ok = 0
for i, pid in enumerate(akan, 1):
    d = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw = d.get("content", {}).get("raw", "")
    open(f"{BACKUP}/post_{pid}.txt", "w").write(raw)
    baru = POLA.sub(lambda mm: f'href="{TARGET}"', raw)
    if baru == raw:
        ok += 1
        continue
    rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"content": baru})
    cek = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    if all(t == TARGET for t in POLA.findall(raw2)):
        ok += 1
    else:
        print(f"   ⚠️ #{pid}: {[t[:60] for t in POLA.findall(raw2)][:2]}")
    if i % 25 == 0 or i == len(akan):
        print(f"   progres {i}/{len(akan)} | beres {ok}")

print("\n=== verifikasi seluruh situs ===")
posts2, page = [], 1
while True:
    d = rest(f"/wp-json/wp/v2/posts?per_page=100&page={page}&status=publish&context=edit&_fields=id,content")
    if not isinstance(d, list):
        break
    posts2 += d
    if len(d) < 100:
        break
    page += 1
sesuai = beda = 0
artikel_ok = 0
nomor = Counter()
for p in posts2:
    tautan = POLA.findall(p.get("content", {}).get("raw", ""))
    if not tautan:
        continue
    if all(t == TARGET for t in tautan):
        artikel_ok += 1
    for t in tautan:
        if t == TARGET:
            sesuai += 1
        else:
            beda += 1
            nomor[re.search(r"phone=([^&]+)|wa\.me/([^?]+)", t).group(0)[:34]] += 1
print(f"   artikel yang seluruh tautannya sudah final: {artikel_ok}")
print(f"   tautan sesuai: {sesuai} | masih beda: {beda} {dict(nomor) if nomor else ''}")
