#!/usr/bin/env python3
"""Verifikasi teks pasal: UU 16/2011, UU 18/2003 Pasal 22, KUHAP Pasal 56, UU 48/2009, Perma 1/2014 — 16 Okt 2026."""
import re, zlib, urllib.request, urllib.error

UA = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124 Safari/537.36"}


def get(u, n=3000000):
    try:
        r = urllib.request.Request(u, headers=UA)
        with urllib.request.urlopen(r, timeout=90) as x:
            return x.status, x.read(n)
    except urllib.error.HTTPError as e:
        return e.code, b""
    except Exception as e:
        return type(e).__name__, b""


def teks(b):
    t = b.decode("utf-8", "replace")
    t = re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", t, flags=re.S | re.I)
    t = re.sub(r"<[^>]+>", " ", t)
    t = re.sub(r"&nbsp;?", " ", t)
    t = re.sub(r"&amp;", "&", t)
    return re.sub(r"\s+", " ", t).strip()


def pdf_text(b):
    hasil = []
    for c in re.findall(rb"stream\r?\n(.*?)endstream", b, re.S):
        try:
            d = zlib.decompress(c)
        except Exception:
            continue
        for m in re.finditer(rb"\((?:[^()\\]|\\.)*\)", d):
            hasil.append(m.group(0)[1:-1].decode("latin-1", "replace"))
    return re.sub(r"\s+", " ", " ".join(hasil))


def periksa(url, pola, label, maks=460):
    st, b = get(url)
    print(f"\n=== {label} → HTTP {st}, {len(b)} byte")
    if st != 200 or not b:
        return ""
    t = pdf_text(b) if b[:4] == b"%PDF" else teks(b)
    print(f"    (teks {len(t)} karakter)")
    for pat in pola:
        n = 0
        for m in re.finditer(re.escape(pat), t, re.I):
            a, z = max(0, m.start() - 120), min(len(t), m.start() + maks)
            print(f"  [{pat}] ...{t[a:z]}...")
            n += 1
            if n >= 2:
                break
        if n == 0:
            print(f"  [{pat}] TIDAK DITEMUKAN")
    return t


# 1) UU 16/2011 Bantuan Hukum (PDF resmi BPHN)
periksa("https://bphn.go.id/data/documents/11uu016.pdf",
        ["Pasal 4", "Pasal 5", "Pasal 7", "Pasal 14", "Pasal 16", "Pasal 19", "Pasal 20", "terakreditasi",
         "orang atau kelompok orang miskin", "Pasal 1"],
        "UU 16/2011 Bantuan Hukum")

# 2) UU 18/2003 Advokat Pasal 22 (PDF Hukumonline)
periksa("https://learning.hukumonline.com/wp-content/uploads/2021/09/UU-Advokat.pdf",
        ["Pasal 22"], "UU 18/2003 Advokat")

# 3) UU 48/2009 Kekuasaan Kehakiman Pasal 56 & 57 (PDF BPK)
periksa("https://peraturan.bpk.go.id/Download/28122/UU%20Nomor%2048%20Tahun%202009.pdf",
        ["Pasal 56", "Pasal 57"], "UU 48/2009")

# 4) Perma 1/2014 layanan hukum masyarakat tidak mampu (PDF BPK)
periksa("https://peraturan.bpk.go.id/Download/258652/Perma%20Nomor%201%20Tahun%202014.pdf",
        ["Pasal 1", "Pasal 2", "Pos Bantuan Hukum", "Pasal 4"], "Perma 1/2014 Posbakum")

# 5) KUHAP Pasal 56 (sumber instansi)
periksa("https://jdih.sukoharjokab.go.id/berita/detail/miranda-rule-dalam-kuhap",
        ["Pasal 56", "penasihat hukum", "tidak mampu"], "KUHAP Pasal 56 (JDIH Sukoharjo)")

# 6) BPHN: syarat mengajukan bantuan hukum
periksa("https://bantuanhukum.bphn.go.id/blog/syarat-mengajukan-bantuan-hukum/",
        ["Surat Keterangan Tidak Mampu", "akreditasi", "SKTM", "syarat"], "BPHN syarat")

# 7) LBH Surabaya
periksa("https://bantuanhukumsby.or.id/",
        ["Yayasan", "bantuan hukum", "gratis", "cuma-cuma", "alamat", "Surabaya"],
        "LBH Surabaya")

# 8) Permenkum 37/2025 akreditasi OBH
periksa("https://peraturan.bpk.go.id/Details/331883/permenkum-no-37-tahun-2025",
        ["Tata Cara Verifikasi dan Akreditasi", "Berlaku"], "Permenkum 37/2025")
