#!/usr/bin/env python3
"""TSC — arahkan tautan domain lama ke situs sekarang.

Perintah Bos 7 Okt 2026: "ubah tautan klinikdnisidoarjo.com ke https://www.theskincodeclinic.com".
Tautan ke klinikdnikrian.com (domain lama yang sama) ikut diarahkan, dan bila teks tautannya berupa
nama domain lama, teks itu diganti menjadi "The Skin Code Clinic".

Pakai --go untuk menulis. Salinan isi disimpan lebih dulu.
"""
import base64, importlib.util, json, os, re, sys, time, urllib.error, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
BACKUP = f"{WS}/tsc_backup_domain"
os.makedirs(BACKUP, exist_ok=True)

spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_tsc.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
CFG = m.CFG
DOM = CFG["domain"]
AUTH = base64.b64encode(f"{CFG['user']}:{CFG['pass']}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BARU = "https://www.theskincodeclinic.com"

POLA_URL = re.compile(r"https?://(?:www\.)?klinikdni(?:sidoarjo|krian)\.com[^\s\"'<>)]*", re.I)
POLA_TEKS = re.compile(r">\s*klinikdni(?:sidoarjo|krian)\.com\s*<", re.I)


def rest(path, 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}{path}", 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"


go = "--go" in sys.argv
total_url = total_teks = 0
terdampak = []
for jenis in ("posts", "pages"):
    page = 1
    while True:
        st, d = rest(f"/wp-json/wp/v2/{jenis}?per_page=100&page={page}&status=publish&context=edit"
                     f"&_fields=id,slug,link,title,content")
        if not isinstance(d, list) or not d:
            break
        for x in d:
            raw = x["content"]["raw"]
            n_url = len(POLA_URL.findall(raw))
            n_teks = len(POLA_TEKS.findall(raw))
            if not (n_url or n_teks):
                continue
            baru = POLA_TEKS.sub(">The Skin Code Clinic<", POLA_URL.sub(BARU, raw))
            total_url += n_url
            total_teks += n_teks
            terdampak.append({"jenis": jenis, "id": x["id"], "link": x["link"],
                              "tautan": n_url, "teks": n_teks})
            print(f"  #{x['id']:<6} {jenis:<6} tautan {n_url} · teks {n_teks} | {x['link'][:62]}")
            if go:
                open(f"{BACKUP}/{jenis}_{x['id']}.txt", "w").write(raw)
                st2, _ = rest(f"/wp-json/wp/v2/{jenis}/{x['id']}", "POST", {"content": baru})
                if st2 != 200:
                    print(f"        ❌ tulis gagal HTTP {st2}")
                time.sleep(0.3)
        if len(d) < 100:
            break
        page += 1

print(f"\nkonten: {len(terdampak)} · tautan domain lama: {total_url} · teks domain lama: {total_teks}")
json.dump(terdampak, open(f"{WS}/drafts/tsc_perubahan_domain.json", "w"), ensure_ascii=False, indent=1)
if not go:
    print("(dry run — pakai --go)")
else:
    print(f"salinan: {BACKUP}/")
