#!/usr/bin/env python3
"""DAS: (1) perbaiki nomor WA salah, (2) tambah tombol AMBIL PROMO ke artikel yang belum punya,
(3) seragamkan teks + warna tombol.
Baku: teks "AMBIL PROMO" · warna #d02c35 · tautan wa.me/6285242380789?text=Hallo+DAS+Saya+ingin+AMBIL+PROMO
Salinan tiap artikel disimpan sebelum diubah. Jalankan --apply untuk menulis."""
import base64, html, 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"}
BACKUP = f"{WS}/das_pemulihan/cta"
os.makedirs(BACKUP, exist_ok=True)

NOMOR = "6285242380789"
WARNA = "#d02c35"
TEKS = "AMBIL PROMO"
TARGET = f"https://wa.me/{NOMOR}?text=Hallo+DAS+Saya+ingin+AMBIL+PROMO"
TOMbol = ('<p style="text-align:center;margin:34px 0 6px">'
          f'<a href="{TARGET}" target="_blank" rel="noopener" style="display:inline-block;'
          f'background-color:{WARNA};color:#ffffff;padding:16px 36px;font-size:20px;font-weight:bold;'
          'text-decoration:none;border-radius:8px;">' + TEKS + '</a></p>')

NOMOR_SALAH = {"6281935000624": "StudioSoft", "6281909222026": "TSLaw", "6285242430789": "angka tertukar"}
TEKS_VARIAN = [">AMBIL PROMO SEKARANG</a>", ">KONSULTASIKAN MOBIL ANDA</a>", ">KLIK DISINI</a>", ">Klik Disini</a>"]


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"


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

rencana = []
for p in posts:
    raw = p.get("content", {}).get("raw", "") or ""
    baru = raw
    aksi = []

    # (1) nomor salah → benar (termasuk label angka yang ditampilkan)
    for no, ket in NOMOR_SALAH.items():
        if no in baru:
            baru = baru.replace(f"wa.me/{no}", f"wa.me/{NOMOR}")
            baru = baru.replace(no, NOMOR)
            aksi.append(f"nomor {ket}")
    if "0852-4243-0789" in baru:
        baru = baru.replace("0852-4243-0789", "0852-4238-0789")
        aksi.append("label nomor")

    # (3) seragamkan teks + warna tombol yang sudah ada
    for var in TEKS_VARIAN:
        if var in baru:
            baru = baru.replace(var, f">{TEKS}</a>")
            aksi.append("teks tombol")
    if "#f97316" in baru.lower():
        baru = re.sub(r"#f97316", WARNA, baru, flags=re.I)
        aksi.append("warna oranye→merah")
    if "#25d366" in baru.lower():
        baru = re.sub(r"#25d366", WARNA, baru, flags=re.I)
        aksi.append("warna hijau→merah")

    # (2) belum punya tombol → tambahkan di akhir artikel
    kalau_tambah = not re.search(r"AMBIL\s*PROMO", baru, re.I)
    if kalau_tambah:
        baru = baru.rstrip() + "\n" + TOMbol + "\n"
        aksi.append("tombol baru")

    if baru != raw:
        rencana.append({"id": p["id"], "slug": p["slug"], "link": p["link"], "raw": raw, "baru": baru,
                        "aksi": sorted(set(aksi)), "tambah": kalau_tambah})

print(f"\n=== rencana perubahan: {len(rencana)} artikel ===")
from collections import Counter
c = Counter(a for r in rencana for a in r["aksi"])
for k, v in c.most_common():
    print(f"   {k:<22} {v} artikel")

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

print("\n=== menulis ===")
ok = gagal = 0
for i, r in enumerate(rencana, 1):
    open(f"{BACKUP}/post_{r['id']}.txt", "w").write(r["raw"])
    rest(f"/wp-json/wp/v2/posts/{r['id']}", "POST", {"content": r["baru"]})
    _, cek = rest(f"/wp-json/wp/v2/posts/{r['id']}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    if raw2 == r["baru"]:
        ok += 1
    else:
        gagal += 1
        print(f"   ⚠️ #{r['id']} tidak sama dengan yang dikirim")
    if i % 20 == 0 or i == len(rencana):
        print(f"   progres {i}/{len(rencana)} | beres {ok} | gagal {gagal}")

print("\n=== verifikasi ulang ===")
posts2, page = [], 1
while True:
    st, 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
punya = sum(1 for p in posts2 if re.search(r"AMBIL\s*PROMO", p.get("content", {}).get("raw", "") or "", re.I))
warnamerah = sum(1 for p in posts2 if WARNA in (p.get("content", {}).get("raw", "") or "").lower())
nomor_benar = sum(1 for p in posts2 if NOMOR in (p.get("content", {}).get("raw", "") or ""))
sisa_salah = [p["id"] for p in posts2 if any(no in (p.get("content", {}).get("raw", "") or "") for no in NOMOR_SALAH)]
print(f"   artikel dengan tombol AMBIL PROMO : {punya}/{len(posts2)}")
print(f"   artikel dengan warna {WARNA}     : {warnamerah}")
print(f"   artikel memakai nomor benar       : {nomor_benar}")
print(f"   artikel yang masih memakai nomor salah: {sisa_salah or 'tidak ada'}")
