#!/usr/bin/env python3
"""Rapikan baris yang patah di tengah kalimat pada situs klien mana pun.

Hanya menyentuh elemen teks yang isinya murni teks (tanpa tag di dalamnya), supaya tidak
menyenggol markup blok. Atribut tag dipertahankan, teks tidak diubah sama sekali.

Pakai:  rapikan_baris_klien.py cfg_tslaw.py [--go]
"""
import base64, importlib.util, json, re, sys, time, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
TAG = ("p", "li", "h1", "h2", "h3", "h4", "blockquote", "figcaption")
POLA = re.compile(r"(<(" + "|".join(TAG) + r")(?:\s[^>]*)?>)(.*?)</\2>", re.S | re.I)


def patahan(isi):
    """Elemen teks murni yang barisnya dipotong di tengah kalimat."""
    hasil = []
    for mo in POLA.finditer(isi):
        dalam = mo.group(3)
        if "<" in dalam or "\n" not in dalam:
            continue
        baris = [b.strip() for b in dalam.split("\n") if b.strip()]
        if len(baris) < 2:
            continue
        for b in baris[:-1]:
            if not re.search(r"[.!?:;]\s*$", b):
                hasil.append(b[-70:])
                break
    return hasil


def rapikan(isi):
    def ganti(mo):
        dalam = mo.group(3)
        if "<" in dalam or "\n" not in dalam:
            return mo.group(0)
        rapi = re.sub(r"\s{2,}", " ", re.sub(r"\s*\n\s*", " ", dalam)).strip()
        return f"{mo.group(1)}{rapi}</{mo.group(2)}>"
    return POLA.sub(ganti, isi)


cfg = sys.argv[1] if len(sys.argv) > 1 and sys.argv[1].endswith(".py") else "cfg_tslaw.py"
GO = "--go" in sys.argv
spec = importlib.util.spec_from_file_location("c", f"{WS}/{cfg}")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
CFG = m.CFG
DOM = CFG.get("domain", CFG.get("situs"))
A = base64.b64encode(f"{CFG['user']}:{CFG['pass']}".encode()).decode()
H = {"Authorization": f"Basic {A}", "User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
print(f"=== {DOM} ({cfg}) ===")

cadangan, n = {}, 0
for jenis in ("posts", "pages"):
    hal = 1
    while True:
        u = (f"https://{DOM}/wp-json/wp/v2/{jenis}?per_page=100&page={hal}"
             "&status=publish,draft,future&context=edit&_fields=id,link,content,status")
        try:
            d = json.loads(urllib.request.urlopen(urllib.request.Request(u, headers=H), timeout=180).read())
        except Exception as e:
            print(f"   {jenis} hal {hal}: {str(e)[:60]}")
            break
        if not isinstance(d, list) or not d:
            break
        for x in d:
            c = x["content"]["raw"]
            p = patahan(c)
            if not p:
                continue
            rapi = rapikan(c)
            t1 = re.sub(r"\s+", " ", re.sub("<[^>]+>", " ", c)).strip()
            t2 = re.sub(r"\s+", " ", re.sub("<[^>]+>", " ", rapi)).strip()
            n += 1
            print(f"   #{x['id']:<6} [{x['status']:<7}] patahan {len(p):<3} · "
                  f"{'AMAN' if t1 == t2 else '⚠ TEKS BERUBAH'} · {x['link'].replace('https://' + DOM, '')[:44]}")
            for k in p[:2]:
                print(f"        …{k}")
            cadangan[str(x["id"])] = c
            if GO and t1 == t2:
                try:
                    r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/{jenis}/{x['id']}",
                                               data=json.dumps({"content": rapi}).encode(), headers=H, method="POST")
                    urllib.request.urlopen(r, timeout=180).read()
                except Exception as e:
                    print(f"        gagal simpan: {str(e)[:70]}")
                time.sleep(0.8)
        if len(d) < 100:
            break
        hal += 1

if GO:
    nama = cfg.replace("cfg_", "").replace(".py", "")
    json.dump(cadangan, open(f"{WS}/backup_rapi_baris_{nama}.json", "w"), ensure_ascii=False)
    print(f"\n✅ {n} entri dirapikan · cadangan: backup_rapi_baris_{nama}.json")
else:
    print(f"\n(uji) {n} entri perlu dirapikan. Pakai --go untuk memperbaiki.")
