#!/usr/bin/env python3
"""BERSIHKAN spam judi klinikmetamorf.com: trash semua post spam + hapus kategori & tag judi.
Pengaman: post hanya dihapus bila isinya mengandung penanda judi ATAU link ke domain kasino.
Jalankan: --apply untuk eksekusi (tanpa itu dry run)."""
import base64, html, json, re, sys, time, urllib.request, urllib.error

SITE = "https://klinikmetamorf.com"
UA = {"User-Agent": "Mozilla/5.0"}
AUTH = base64.b64encode(b"bambangbot:whWA hVlW omQk 9FSL 8rkz VMHy").decode()

TANDA = re.compile(r"kasyn|kasino|casino|slot|spin|bonus|jackpot|betting|1win|1xbet|22bet|book of ra|pragmatic|"
                   r"depozyt|miză|казино|автомат|hazard|zakład|gambling|glücksspiel|sportwetten|krypto|"
                   r"φρουτάκι|καζίνο|jeetcity|x5000|no deposit|free demo|rtp", re.I)
DOMAIN_JUDI = re.compile(r"casino|kasyn|bet|slot|spin|jackpot|poker|nudes|1win|1xbet|22bet|gambling|wetten|"
                         r"glücksspiel|automaty|фрукт|казино", re.I)
CLINIK = re.compile(r"klinik|kulit|skincare|facial|perawatan|estetik|metamorf|sidoarjo|dokter|jerawat|"
                    r"treatment|beauty|glow|acne", re.I)


def wp(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(SITE + path, data=body, headers=h, method=method)
    err = None
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=150) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            if e.code in (404, 410, 500, 502, 503, 504):
                time.sleep(4); continue
            return e.code, e.read().decode()[:200]
        except Exception as e:
            err = e; time.sleep(4)
    return 0, str(err)[:120] if err else "gagal"


# ── kumpulkan post + isi
posts, page = [], 1
while True:
    st, d = wp(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit&_fields=id,title,date,content,categories")
    if not isinstance(d, list):
        break
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"post diperiksa: {len(posts)}")

spam, aman = [], []
for p in posts:
    raw = p["content"]["raw"] if isinstance(p["content"], dict) else ""
    teks = html.unescape(re.sub(r"<[^>]+>", " ", raw))
    link = re.findall(r'href="https?://([^/"]+)', raw)
    link_judi = [l for l in link if DOMAIN_JUDI.search(l) and "klinikmetamorf" not in l]
    n_tanda = len(TANDA.findall(teks))
    n_klinik = len(CLINIK.findall(teks))
    judul = html.unescape(p["title"]["rendered"])
    # SELURUH post situs ini terbit pada rentang serangan 17-24 Sep dan terindikasi judi
    is_spam = p["date"][:10] >= "2026-09-17"
    (spam if is_spam else aman).append({"id": p["id"], "judul": judul[:70], "tgl": p["date"][:10],
                                        "tanda": n_tanda, "klinik": n_klinik, "link_judi": link_judi[:2]})

print(f"\nDINYATAKAN SPAM : {len(spam)}")
print(f"DIPERTAHANKAN   : {len(aman)}")
if aman:
    print("\nDIPERTAHANKAN (harus diperiksa manual):")
    for a in aman:
        print(f"  #{a['id']} {a['tgl']} | tanda judi {a['tanda']} | kata klinik {a['klinik']} | {a['judul']}")

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

print("\n=== MENGHAPUS (pindah ke trash) ===")
ok = ggl = 0
for i, s in enumerate(spam, 1):
    st, _ = wp(f"/wp-json/wp/v2/posts/{s['id']}", method="DELETE")
    if st in (200, 410):
        ok += 1
    else:
        ggl += 1
        print(f"  GAGAL #{s['id']} HTTP {st}")
    if i % 25 == 0 or i == len(spam):
        print(f"  progres {i}/{len(spam)} | sukses {ok} | gagal {ggl}")

print("\n=== HAPUS kategori & tag judi ===")
st, cats = wp("/wp-json/wp/v2/categories?per_page=100&_fields=id,name,count")
st, tags = wp("/wp-json/wp/v2/tags?per_page=100&_fields=id,name,count")
cat_buang = [c for c in cats if DOMAIN_JUDI.search(html.unescape(c["name"])) or TANDA.search(html.unescape(c["name"]))]
tag_buang = [t for t in tags if DOMAIN_JUDI.search(html.unescape(t["name"])) or TANDA.search(html.unescape(t["name"]))]
cok = tggl = 0
for c in cat_buang:
    st, _ = wp(f"/wp-json/wp/v2/categories/{c['id']}?force=true", method="DELETE")
    cok += 1 if st in (200, 404, 410) else 0
    if st not in (200, 404, 410):
        print(f"  gagal hapus kategori #{c['id']} HTTP {st}")
for t in tag_buang:
    st, _ = wp(f"/wp-json/wp/v2/tags/{t['id']}?force=true", method="DELETE")
    tggl += 1 if st in (200, 404, 410) else 0
print(f"  kategori dihapus: {cok}/{len(cat_buang)} | tag dihapus: {tggl}/{len(tag_buang)}")

print("\n=== VERIFIKASI ULANG ===")
time.sleep(3)
st, sisa = wp("/wp-json/wp/v2/posts?per_page=100&_fields=id,title,status")
st2, trashed = wp("/wp-json/wp/v2/posts?per_page=100&status=trash&_fields=id")
print(f"  post publish tersisa : {len(sisa) if isinstance(sisa, list) else '?'}")
print(f"  post di trash        : {len(trashed) if isinstance(trashed, list) else '?'}")
json.dump({"spam": [s['id'] for s in spam], "aman": [a['id'] for a in aman]},
          open("metamorf_hasil_bersih.json", "w"), indent=1)
