#!/usr/bin/env python3
"""TSC #1908: rapikan duplikasi (2 blok FAQ + 3 schema) yang muncul dari penulisan ulang.
Hasil akhir: isi baru + SATU blok FAQ + SATU schema + SATU bagian 'Baca juga'."""
import base64, html, json, os, re, sys, time, urllib.request, importlib.util

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg_tsc", f"{WS}/cfg_tsc.py")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DOM, AUTH = m.CFG["domain"], base64.b64encode(f'{m.CFG["user"]}:{m.CFG["pass"]}'.encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
PID = 1908
BACKUP = f"{WS}/tsc_pemulihan/salinan_tipis"


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 json.loads(x.read())
        except Exception:
            time.sleep(4)
    return {}


d = rest(f"/wp-json/wp/v2/posts/{PID}?context=edit&_fields=content,link")
raw = d["content"]["raw"]
open(f"{BACKUP}/post_{PID}_sebelum_rapi.txt", "w").write(raw)

# 1. ambil isi baru: dari awal sampai akhir heading 'Kesimpulan'
kepala = raw.split("<h2>Tanda yang perlu diwaspadai</h2>")[0]
kesimpulan = re.search(r"<h2[^>]*>\s*Kesimpulan\s*</h2>.*?(?=<h2[^>]*>\s*FAQ\s*</h2>)", raw, re.S)
bagian_awal = (raw[:raw.find("<h2>Tanda yang perlu diwaspadai</h2>")] if "<h2>Tanda yang perlu diwaspadai</h2>" in raw else kepala)
peringatan = re.search(r"<h2[^>]*>\s*Tanda yang perlu diwaspadai\s*</h2>.*?(?=<h2[^>]*>\s*Kesimpulan\s*</h2>)", raw, re.S)
awal = bagian_awal + (peringatan.group(0) if peringatan else "") + (kesimpulan.group(0) if kesimpulan else "")

# 2. ambil satu blok FAQ (yang terakhir lengkap dengan schema sudah cukup diambil manual)
FAQ = [
 ("Apa yang perlu diperiksa dari seorang dokter kulit?",
  "Pastikan ia dokter spesialis kulit dan kelamin, bukan hanya petugas yang menjalankan tindakan. Perhatikan juga alur kerjanya: pemeriksaan lebih dulu, diagnosis setelahnya, baru tindakan sesuai indikasi."),
 ("Apakah tindakan kulit bisa bebas risiko?",
  "Tidak. Setiap tindakan medis memiliki kemungkinan efek samping seperti kemerahan, bengkak sementara, atau hasil yang perlu perawatan lanjutan. Dokter yang baik menjelaskan hal ini sebelum Anda memutuskan."),
 ("Bagaimana hasil perawatan dievaluasi?",
  "Melalui kunjungan kontrol. Pada kunjungan itu dokter menilai perubahan kondisi kulit, menyesuaikan perawatan, dan menentukan apakah tindakan lanjutan diperlukan atau justru dihentikan."),
 ("Apakah semua keluhan kulit perlu tindakan?",
  "Tidak. Banyak keluhan cukup ditangani dengan obat dan penyesuaian perawatan harian. Tindakan seperti peeling atau laser diberikan bila indikasinya sesuai dengan kondisi kulit Anda."),
 ("Apa yang perlu disiapkan pada konsultasi pertama?",
  "Catatan keluhan dan waktu kemunculannya, daftar produk atau obat yang pernah dipakai, serta riwayat alergi. Bila ada foto kondisi sebelumnya, bawa sebagai bahan pembanding."),
]
blok_faq = "<h2>FAQ</h2>\n" + "\n".join(f"<h3>{q}</h3><p>{a}</p>" for q, a in FAQ)
skema = {"@context": "https://schema.org", "@type": "FAQPage",
         "mainEntity": [{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in FAQ]}
blok_skema = '<script type="application/ld+json">\n' + json.dumps(skema, ensure_ascii=False, indent=1) + "</script>"

# 3. bagian 'Baca juga' diambil dari tautan internal yang sudah ada
link = sorted(set(re.findall(r'href="(https://www\.theskincodeclinic\.com/[^"]+)"', raw)))
pilihan = [l for l in link if "/category/" not in l and "/tag/" not in l][:4]
baca = "<h2>Baca juga</h2>\n<p>Artikel berikut masih berkaitan dengan topik di atas: " + \
       ", ".join(f'<a href="{l}">{l.rstrip("/").split("/")[-1].replace("-", " ").title()[:60]}</a>' for l in pilihan) + ".</p>"

baru = awal.rstrip() + "\n" + blok_faq + "\n" + baca + "\n" + blok_skema + "\n"
print(f"sebelum: {len(raw)} karakter | heading FAQ {len(re.findall(r'<h2[^>]*>s*FAQ', raw, re.I))} | schema {raw.count('application/ld+json')}")
print(f"sesudah: {len(baru)} karakter | heading FAQ {len(re.findall(r'<h2[^>]*>s*FAQ', baru, re.I))} | schema {baru.count('application/ld+json')}")
print(f"tautan 'Baca juga': {len(pilihan)}")

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

rest(f"/wp-json/wp/v2/posts/{PID}", "POST", {"content": baru})
cek = rest(f"/wp-json/wp/v2/posts/{PID}?context=edit&_fields=content,link")
raw2 = cek.get("content", {}).get("raw", "")
teks = html.unescape(re.sub(r"<[^>]+>", " ", re.sub(r"<script.*?</script>", " ", raw2, flags=re.S)))
print(f"\n   kata: {len([w for w in teks.split() if w])} | FAQPage: {raw2.count('FAQPage')} | "
      f"blok FAQ: {len(re.findall(r'<h2[^>]*>FAQ</h2>', raw2))} | cocok: {'✅' if raw2 == baru else '⚠️'}")
hh = urllib.request.urlopen(urllib.request.Request(cek["link"] + f"?v={int(time.time())}", headers=UA), timeout=90).read().decode("utf-8", "replace")
t = re.search(r"<title>(.*?)</title>", hh, re.S)
print(f"   live judul: {t.group(1).strip() if t else '-'}")
print(f"   live: FAQPage {hh.count('FAQPage')} | 'Rp' {hh.count('Rp')} | 'garansi' {hh.lower().count('garansi')} | 'BPOM' {hh.count('BPOM')}")
