#!/usr/bin/env python3
"""Kumpulkan SEMUA kalimat yang memuat harga di TSC, Yasmanatura, dan SSC, lengkap dengan alamatnya.

Hasil: drafts/harga_kalimat_lengkap.md (untuk dibaca manusia) + .json (untuk dikerjakan skrip).
"""
import base64, importlib.util, json, os, re, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
HARGA = re.compile(r"(Rp\s?[\d][\d.,]*|IDR\s?[\d][\d.,]*|\b\d+(?:[.,]\d+)?\s?(?:juta|ribu|jt|rb)\b|"
                   r"diskon\s+\d+\s?%|potongan\s+\d+\s?%|\b\d+\s?%\s*(?:lebih murah|lebih hemat))", re.I)
SITUS = [("The Skin Code", "cfg_tsc.py"), ("Yasmanatura", "cfg_yasma.py"),
         ("Surabaya Skin Centre", "cfg_ssc.py")]


def bersih(h):
    t = re.sub(r"<script.*?</script>|<style.*?</style>", " ", h, flags=re.S | re.I)
    t = re.sub("<[^>]+>", " ", t)
    t = t.replace("&nbsp;", " ").replace("&#8211;", "-").replace("&#8220;", '"').replace("&#8221;", '"')
    t = t.replace("&amp;", "&").replace("&#8216;", "'").replace("&#8217;", "'")
    return re.sub(r"\s+", " ", t).strip()


def kalimat(teks, pos):
    """Ambil kalimat penuh yang memuat posisi tertentu."""
    awal = max(teks.rfind(". ", 0, pos), teks.rfind("? ", 0, pos), teks.rfind("! ", 0, pos))
    awal = 0 if awal == -1 else awal + 2
    akhir = len(teks)
    for tanda in (". ", "? ", "! "):
        i = teks.find(tanda, pos)
        if i != -1:
            akhir = min(akhir, i + 1)
    return teks[awal:akhir].strip()


hasil = []
for nama, berkas in SITUS:
    f = f"{WS}/{berkas}"
    spec = importlib.util.spec_from_file_location("c", f)
    mm = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mm)
    C = mm.CFG
    dom = C.get("domain", C.get("situs"))
    A = base64.b64encode(f"{C['user']}:{C['pass']}".encode()).decode()
    H = {"Authorization": f"Basic {A}", "User-Agent": "Mozilla/5.0"}
    for jenis in ("posts", "pages"):
        hal = 1
        while hal <= 4:
            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,title")
            try:
                d = json.loads(urllib.request.urlopen(urllib.request.Request(u, headers=H), timeout=180).read())
            except Exception:
                break
            if not isinstance(d, list) or not d:
                break
            for x in d:
                teks = bersih(x["content"]["raw"])
                ketemu, dilihat = [], set()
                for mo in HARGA.finditer(teks):
                    k = kalimat(teks, mo.start())
                    if k in dilihat or len(k) < 12:
                        continue
                    dilihat.add(k)
                    ketemu.append({"angka": mo.group(0).strip(), "kalimat": k})
                if ketemu:
                    hasil.append({"situs": nama, "domain": dom, "id": x["id"], "jenis": jenis,
                                  "status": x["status"], "link": x["link"],
                                  "judul": re.sub("<[^>]+>", "", x["title"]["rendered"])[:90],
                                  "temuan": ketemu})
            if len(d) < 100:
                break
            hal += 1

json.dump(hasil, open(f"{WS}/drafts/harga_kalimat_lengkap.json", "w"), ensure_ascii=False, indent=1)

with open(f"{WS}/drafts/harga_kalimat_lengkap.md", "w") as f:
    f.write("# Semua kalimat berharga di TSC, Yasmanatura, SSC\n\n")
    total = 0
    for situs in ("The Skin Code", "Yasmanatura", "Surabaya Skin Centre"):
        bagian = [h for h in hasil if h["situs"] == situs]
        n = sum(len(h["temuan"]) for h in bagian)
        total += n
        f.write(f"## {situs} — {n} kalimat di {len(bagian)} halaman\n\n")
        for h in bagian:
            f.write(f"### #{h['id']} [{h['status']}] {h['judul']}\n{h['link']}\n\n")
            for t in h["temuan"]:
                f.write(f"- «{t['angka']}» … {t['kalimat']}\n")
            f.write("\n")
    f.write(f"\n**Total: {total} kalimat**\n")

print(f"halaman: {len(hasil)} · kalimat: {sum(len(h['temuan']) for h in hasil)}")
for situs in ("The Skin Code", "Yasmanatura", "Surabaya Skin Centre"):
    b = [h for h in hasil if h["situs"] == situs]
    print(f"   {situs:<22} {sum(len(h['temuan']) for h in b):>3} kalimat di {len(b)} halaman")
print("→ drafts/harga_kalimat_lengkap.md")
