#!/usr/bin/env python3
"""Buka sumber langsung untuk klaim yang akan ditulis di #2944 (utang piutang) — 14 Okt 2026."""
import json, re, 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=400000):
    try:
        r = urllib.request.Request(u, headers=UA)
        with urllib.request.urlopen(r, timeout=70) as x:
            return x.status, x.read(n).decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return e.code, ""
    except Exception as e:
        return type(e).__name__, ""


def teks(html):
    t = re.sub(r"<(script|style)[^>]*>.*?</\1>", " ", html, flags=re.S | re.I)
    t = re.sub(r"<[^>]+>", " ", t)
    t = re.sub(r"&nbsp;?", " ", t)
    t = re.sub(r"&amp;", "&", t)
    t = re.sub(r"&#8217;|&rsquo;", "'", t)
    t = re.sub(r"&quot;", '"', t)
    return re.sub(r"\s+", " ", t).strip()


TARGET = [
    ("KUHPerdata 1967/1970 daluwarsa", "https://www.ilslawfirm.co.id/daluwarsa-penagihan-hutang/",
     [r"1967", r"30 tahun", r"daluwarsa", r"lima tahun|5 tahun"]),
    ("KUHPerdata 1249/1250 bunga moratoir", "https://bplawyers.co.id/2022/01/18/bagaimana-menetapkan-perhitungan-bunga-moratoir-jika-debitur-lalai/",
     [r"1250", r"1249", r"moratoir", r"sejak"]),
    ("UU 37/2004 Pasal 2 (bpk)", "https://peraturan.bpk.go.id/Details/40181",
     [r"dua atau lebih", r"jatuh waktu", r"pailit"]),
    ("Perma 4/2019 gugatan sederhana (PN Blangkejeren)", "https://pn-blangkejeren.go.id/web/mekanisme-gugatan-sederhana-berdasarkan-perma-no-4-tahun-2019/",
     [r"500\.000\.000", r"cidera janji", r"perbuatan melawan hukum", r"25 hari"]),
    ("Pasal 118 HIR (DJKN Kemenkeu)", "https://www.djkn.kemenkeu.go.id/kpknl-bandaaceh/baca-artikel/15667/Formulasi-Surat-Gugatan-Perdata.html",
     [r"118", r"tempat tinggal", r"pengadilan negeri"]),
    ("Pasal 1131/1132 KUHPerdata (DJKN)", "https://www.djkn.kemenkeu.go.id/kpknl-semarang/baca-artikel/15934/Bagaimana-Pengaturan-Jaminan-Dalam-Perspektif-KUHPerdata.html",
     [r"1131", r"1132", r"jaminan"]),
    ("Cessie Pasal 613 (hukumonline)", "https://www.hukumonline.com/klinik/a/dasar-hukum-cessie-dan-penjelasannya-cl311/",
     [r"613", r"cessie", r"akta"]),
    ("Alat bukti Pasal 1866 (hukumonline)", "https://www.hukumonline.com/klinik/a/5-jenis-alat-bukti-dalam-pasal-1866-kuh-perdata-lt6723670b6538a/",
     [r"1866", r"tertulis", r"saksi", r"persangkaan", r"pengakuan", r"sumpah"]),
    ("UU ITE Pasal 5 (bpk)", "https://peraturan.bpk.go.id/Details/37589/uu-no-11-tahun-2008",
     [r"alat bukti hukum yang sah|Pasal 5"]),
    ("Wanprestasi 1243 (HaloJPN Kejaksaan)", "https://halojpn.kejaksaan.go.id/detail/2026-89B6",
     [r"1243", r"biaya, kerugian, dan bunga|biaya, rugi, dan bunga"]),
    ("Utang piutang 1754 (HaloJPN)", "https://halojpn.kejaksaan.go.id/detail/2026-C7F1",
     [r"1754", r"pinjam"]),
]

for nama, url, pola in TARGET:
    st, html = get(url)
    print(f"\n=== {nama}\n    {url}  → HTTP {st}, {len(html)} byte")
    if st != 200 or not html:
        continue
    t = teks(html)
    for p in pola:
        for m in list(re.finditer(p, t, re.I))[:3]:
            a, b = max(0, m.start() - 190), min(len(t), m.end() + 230)
            print(f"    [{p}] ...{t[a:b]}...")
