#!/usr/bin/env python3
"""TSC batch 4 — 5 artikel tipis. Ikuti playbook §6:
  • sisip sebelum <h2>FAQ</h2> → <h2>Kesimpulan</h2> → akhir
  • tambah blok FAQ + schema HANYA bila belum ada
  • jangan mengarang fakta klinik (tanpa harga/jam/nama dokter baru/klaim hasil)
  • salinan dulu, tulis via REST JSON, baca ulang, cek live
  • bonus: rapikan sisa markdown '## ' pada heading artikel #1629
"""
import base64, html, json, os, re, sys, time, urllib.request, urllib.error, 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, USER, PASS = m.CFG["domain"], m.CFG["user"], m.CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
BACKUP = f"{WS}/tsc_pemulihan/salinan_tipis"
os.makedirs(BACKUP, exist_ok=True)

T, F = {}, {}

T[1691] = """<h2>Kapan cara alami tidak lagi cukup</h2>
<p>Makanan bergizi, kebersihan, dan istirahat cukup membantu daya tahan tubuh menekan pertumbuhan kutil, tetapi tidak menghapus virusnya. Karena itu, cara alami paling tepat diposisikan sebagai pendamping. Bila kutil bertambah banyak dalam hitungan minggu, terasa nyeri, berdarah, atau muncul di area kelamin, penanganan medis perlu didahulukan.</p>
<h2>Jenis kutil dan pilihan tindakan medis</h2>
<p>Kutil biasa di tangan, kutil telapak kaki yang nyeri saat berjalan, kutil filiform di wajah dan leher, serta kutil datar yang muncul berkelompok memiliki penanganan yang berbeda. Krioterapi atau pembekuan dengan nitrogen cair banyak dipakai karena praktis. Laser dan elektrokauter dipilih untuk kutil yang besar atau berulang, sementara obat topikal diberikan untuk kutil datar atau sebagai perawatan pendamping.</p>
<h2>Cara mencegah penularan ke orang lain</h2>
<p>Kutil menular melalui kontak langsung dan permukaan yang lembap. Gunakan handuk, sandal, dan alat pribadi secara terpisah, jangan memakai alat potong kuku bergantian, dan hindari menggaruk area kutil karena dapat memindahkan virus ke kulit sekitarnya. Menutup kutil dengan plester juga membantu menekan risiko penyebaran.</p>
"""

F[1691] = [
 ("Apakah kutil bisa hilang sendiri tanpa diobati?",
  "Bisa, terutama pada orang dengan daya tahan tubuh baik. Namun prosesnya bisa berbulan-bulan, dan selama itu kutil berisiko menyebar ke area lain atau menular ke orang di sekitar. Bila mengganggu atau bertambah banyak, penanganan medis lebih cepat."),
 ("Berapa lama pengobatan kutil sampai tuntas?",
  "Bergantung jenis, ukuran, dan jumlahnya. Kutil tunggal sering memerlukan beberapa sesi tindakan dengan jeda beberapa minggu. Kutil telapak kaki biasanya lebih lama karena letaknya dalam dan sering tertekan saat berjalan."),
 ("Apakah kutil menular lewat sentuhan biasa?",
  "Penularan memerlukan kontak dengan permukaan kulit yang terinfeksi atau benda yang dipakai bersama dalam keadaan lembap. Karena itu berbagi handuk, sandal, atau alat pribadi sebaiknya dihindari selama kutil masih ada."),
 ("Kapan kutil sebaiknya diangkat secara medis?",
  "Bila kutil terasa nyeri, berdarah, tumbuh cepat, muncul berkelompok, atau tidak merespons obat yang dijual bebas. Untuk kutil di area kelamin, pemeriksaan dokter diperlukan karena penanganannya berbeda."),
 ("Apakah kutil bisa muncul lagi setelah diangkat?",
  "Bisa. Virus penyebabnya dapat tetap berada di lapisan kulit meski kutilnya sudah hilang secara tampilan. Menjaga kebersihan, tidur cukup, dan mengelola stres membantu menekan kemungkinan kekambuhan."),
]

T[8560] = """<h2>Kenapa keluhan kulit sering diabaikan</h2>
<p>Sebagian besar keluhan kulit tidak terasa nyeri, sehingga dianggap bisa ditunggu. Padahal beberapa kondisi justru lebih sulit ditangani ketika sudah berlangsung lama: jerawat yang meradang berisiko meninggalkan bekas, infeksi jamur yang menyebar memerlukan pengobatan lebih panjang, dan perubahan pada tahi lalat paling mudah ditangani saat masih kecil.</p>
<h2>Apa yang diperiksa saat keluhan sudah berlangsung lama</h2>
<p>Dokter akan menelusuri kronologi keluhan, produk dan obat yang pernah dipakai, serta riwayat alergi. Setelah itu dilakukan pemeriksaan pada kulit, dan bila perlu pemeriksaan penunjang seperti kerokan kulit untuk infeksi jamur atau pemeriksaan lampu khusus. Dari situ disusun diagnosis dan rencana perawatan, bukan langsung tindakan.</p>
<h2>Kapan cukup di rumah, kapan ke dokter</h2>
<p>Keluhan ringan yang muncul sesekali masih bisa dijaga dengan perawatan harian dan pemantauan. Sebaiknya ke dokter bila keluhan menetap lebih dari dua minggu, menyebar, terasa nyeri atau panas, mengganggu tidur, muncul lepuhan atau luka terbuka, atau terjadi setelah memakai obat dan produk baru.</p>
"""

F[8560] = [
 ("Berapa lama keluhan kulit boleh diamati sebelum ke dokter?",
  "Sebagai patokan umum, dua minggu. Bila dalam rentang itu keluhan tidak membaik, justru meluas, atau muncul gejala baru, sebaiknya diperiksa. Untuk tanda bahaya seperti luka yang tidak menutup atau perubahan tahi lalat, jangan menunggu."),
 ("Apakah keluhan kulit ringan bisa sembuh sendiri?",
  "Sebagian bisa, misalnya iritasi ringan akibat produk yang pemakaiannya dihentikan. Namun infeksi jamur dan keluhan yang menular umumnya memerlukan pengobatan agar tidak menyebar atau kembali lagi."),
 ("Tanda bahaya apa yang tidak boleh ditunggu?",
  "Lepuhan berisi cairan, luka yang tidak menutup, ruam yang menyebar cepat disertai demam, nyeri hebat, serta tahi lalat yang berubah warna, bentuk, atau ukuran. Kondisi ini sebaiknya diperiksa segera."),
 ("Apakah perlu memotret kondisi kulit sebelum berkunjung?",
  "Sangat membantu. Foto menunjukkan perubahan dari waktu ke waktu dan membuat penjelasan Anda lebih jelas. Bawa juga daftar produk atau obat yang pernah dipakai, termasuk yang sudah dihentikan."),
 ("Apakah semua keluhan kulit berakhir dengan tindakan?",
  "Tidak. Banyak keluhan cukup ditangani dengan obat dan penyesuaian perawatan harian. Tindakan seperti peeling atau laser diberikan bila indikasinya sesuai, misalnya untuk bekas jerawat atau tekstur kulit."),
]

T[1688] = """<h2>Cara menilai dokter kulit dan kelamin sebelum memilih</h2>
<p>Yang pertama dipastikan adalah latar belakang pemeriksanya: dokter spesialis kulit dan kelamin, atau petugas yang menjalankan tindakan. Ini terlihat dari alur kerjanya. Praktik yang baik memulai dari anamnesis dan pemeriksaan, lalu menetapkan tindakan sesuai diagnosis, bukan menawarkan tindakan lebih dulu.</p>
<p>Yang kedua adalah kejelasan penjelasan: diagnosis disebutkan, alasan pemilihan tindakan dijelaskan, dan alternatifnya dibahas. Yang ketiga adalah keterbukaan soal biaya: rincian diberikan sebelum tindakan dilakukan, bukan setelahnya.</p>
<h2>Pertanyaan yang layak diajukan saat konsultasi</h2>
<p>Sebutkan tujuan Anda dan tanyakan perkiraan lama perawatan, tanda yang perlu diwaspadai di rumah, serta jadwal kontrol berikutnya. Bila ada beberapa pilihan tindakan, tanyakan mana yang paling sesuai dengan kondisi kulit Anda dan apa risikonya. Dokter yang baik tidak keberatan menjelaskan hal ini, karena keputusan tetap ada di tangan pasien.</p>
<h2>Kapan sebaiknya meminta pendapat kedua</h2>
<p>Pendapat kedua masuk akal bila keluhan tidak membaik setelah perawatan berjalan sesuai anjuran, bila usulan tindakan sangat banyak sekaligus, atau bila Anda merasa penjelasan yang diterima terlalu singkat untuk memutuskan. Meminta pendapat kedua bukan tanda tidak percaya, melainkan bagian dari keputusan medis yang wajar.</p>
"""

F[1688] = [
 ("Apa yang membedakan dokter spesialis kulit dan kelamin?",
  "Dokter spesialis kulit dan kelamin menempuh pendidikan lanjutan untuk menangani penyakit kulit, rambut, kuku, dan penyakit menular seksual. Karena itu ia dapat menegakkan diagnosis dan memilih tindakan sesuai kondisi kulit pasien."),
 ("Apakah dokter umum bisa menangani keluhan kulit?",
  "Bisa untuk keluhan sederhana. Namun bila keluhan menetap, berulang, atau memerlukan tindakan seperti laser dan peeling, penanganan sebaiknya dilakukan dokter spesialis agar diagnosisnya tepat."),
 ("Bagaimana memastikan dokter yang saya pilih berizin?",
  "Tanyakan langsung atau cek keanggotaan dokter pada organisasi profesi advokat dan dokter spesialis. Klinik yang terbuka biasanya tidak keberatan menunjukkan informasi tersebut kepada pasien."),
 ("Apakah konsultasi pertama langsung berujung tindakan?",
  "Tidak selalu. Konsultasi pertama umumnya dipakai untuk menegakkan diagnosis dan menyusun rencana perawatan. Tindakan dijadwalkan setelah diagnosis jelas dan pasien menyetujui rencananya."),
 ("Apa yang perlu dibawa pada konsultasi pertama?",
  "Catatan keluhan dan waktunya, daftar produk atau obat yang pernah dipakai, riwayat alergi, serta hasil pemeriksaan sebelumnya bila ada. Untuk keluhan kulit, hindari riasan tebal pada area yang akan diperiksa."),
]

T[1653] = """<h2>Apa arti Sp.DVE bagi pasien</h2>
<p>Sp.DVE adalah gelar spesialis dermatologi dan venereologi, yaitu bidang yang menangani penyakit kulit, rambut, kuku, dan penyakit menular seksual. Bagi pasien, gelar ini berarti dua hal: keluhan diperiksa oleh dokter yang memang menekuni bidangnya, dan tindakan yang diberikan dipilih berdasarkan diagnosis.</p>
<h2>Alur konsultasi: dari pemeriksaan sampai evaluasi</h2>
<p>Kunjungan dimulai dengan menceritakan keluhan dan riwayat pemakaian produk. Setelah itu dokter memeriksa kulit secara langsung, dan bila perlu meminta pemeriksaan penunjang sederhana. Hasilnya berupa diagnosis dan rencana perawatan yang biasanya memuat tiga hal: obat atau tindakan, perawatan harian di rumah, dan jadwal evaluasi.</p>
<p>Evaluasi bukan formalitas. Pada kunjungan lanjutan, dokter menilai apakah keluhan membaik, memerlukan penyesuaian obat, atau perlu tindakan tambahan.</p>
<h2>Menyiapkan kunjungan pertama</h2>
<p>Catat keluhan utama dan waktu kemunculannya, bawa daftar produk yang dipakai, dan sebutkan riwayat alergi serta obat yang sedang dikonsumsi. Bila ada foto kondisi sebelumnya, sertakan sebagai pembanding. Untuk area yang akan diperiksa, hindari riasan tebal dan jangan mencoba produk baru beberapa hari sebelumnya.</p>
"""

F[1653] = [
 ("Apa saja yang ditangani dokter spesialis kulit dan kelamin?",
  "Keluhan kulit seperti jerawat, eksim, alergi, infeksi jamur, dan pigmentasi; keluhan rambut dan kuku; serta keluhan kelamin. Tindakan estetika medis juga tersedia bila sesuai indikasi."),
 ("Apakah konsultasi bisa dilakukan tanpa tindakan?",
  "Bisa. Konsultasi dapat berhenti pada diagnosis dan rencana perawatan, misalnya dengan obat serta penyesuaian perawatan harian. Tindakan hanya dijalankan bila memang diperlukan."),
 ("Berapa lama hasil perawatan mulai terlihat?",
  "Bergantung keluhannya. Infeksi jamur umumnya dievaluasi setelah dua sampai empat minggu, jerawat setelah enam sampai delapan minggu, sedangkan pigmentasi sering memerlukan waktu lebih panjang."),
 ("Apakah perlu membuat janji sebelum datang?",
  "Sangat dianjurkan agar waktu konsultasi tidak terpotong antrean. Sampaikan keluhan utama saat membuat janji supaya waktu yang disiapkan sesuai kebutuhan Anda."),
 ("Apa yang perlu disiapkan sebelum konsultasi?",
  "Daftar keluhan beserta waktunya, produk atau obat yang pernah dipakai, riwayat alergi, serta foto kondisi sebelumnya bila ada. Untuk keluhan kulit, hindari riasan tebal pada area yang akan diperiksa."),
]

T[1629] = """<h2>Keluhan yang paling sering ditangani</h2>
<p>Dari sisi kulit, keluhan yang paling banyak datang adalah jerawat dan bekasnya, eksim serta dermatitis, alergi kulit, infeksi jamur, dan keluhan pigmentasi. Dari sisi kelamin, penanganan mencakup keluhan menular maupun yang disebabkan iritasi, dengan pemeriksaan yang menjaga kerahasiaan pasien. Selain itu, banyak pasien datang untuk tindakan estetika medis seperti perawatan wajah, peeling, microneedling, dan laser.</p>
<h2>Kapan sebaiknya segera diperiksa</h2>
<p>Periksakan lebih awal bila keluhan menyebar cepat, terasa nyeri atau panas, muncul lepuhan atau luka terbuka, menetap lebih dari dua minggu, atau muncul setelah memakai obat dan produk baru. Untuk keluhan kelamin, jangan menunggu sampai terasa nyeri, karena beberapa kondisi justru lebih mudah ditangani pada tahap awal.</p>
<h2>Menyiapkan kunjungan pertama</h2>
<p>Catat keluhan utama dan kapan mulai muncul, bawa daftar produk atau obat yang pernah dipakai, dan sebutkan riwayat alergi. Bila memiliki hasil pemeriksaan sebelumnya, bawa sebagai bahan pertimbangan. Membuat janji lebih dulu membuat waktu konsultasi lebih optimal, terutama pada jam sibuk.</p>
"""

F[1629] = [
 ("Apa itu dokter spesialis kulit dan kelamin?",
  "Dokter yang menempuh pendidikan spesialis dermatologi dan venereologi, yaitu bidang yang menangani penyakit kulit, rambut, kuku, serta penyakit menular seksual. Penanganannya dimulai dari pemeriksaan untuk menegakkan diagnosis."),
 ("Keluhan apa saja yang bisa dikonsultasikan?",
  "Jerawat dan bekasnya, eksim, dermatitis, alergi kulit, infeksi jamur, keluhan pigmentasi, keluhan rambut dan kuku, hingga keluhan kelamin. Tindakan estetika medis juga tersedia bila indikasinya sesuai."),
 ("Apakah konsultasi dijamin kerahasiaannya?",
  "Kerahasiaan adalah bagian dari standar layanan dan wajar ditanyakan. Sebelum memutuskan, tanyakan bagaimana catatan pemeriksaan disimpan dan siapa yang memiliki akses ke data tersebut."),
 ("Apakah keluhan kulit ringan perlu ke dokter?",
  "Tidak semua. Keluhan ringan yang muncul sesekali bisa dijaga dengan perawatan harian. Namun bila menetap lebih dari dua minggu, menyebar, atau mengganggu kualitas tidur, sebaiknya diperiksa."),
 ("Berapa lama penanganan biasanya berjalan?",
  "Bervariasi. Infeksi jamur umumnya dievaluasi dalam dua sampai empat minggu, jerawat dalam enam sampai delapan minggu, sedangkan pigmentasi bisa lebih lama. Dokter akan memberi jadwal evaluasi untuk kondisi Anda."),
]


def blok_faq(pairs):
    h = ["<h2>FAQ</h2>"]
    for q, a in pairs:
        h.append(f"<h3>{q}</h3><p>{a}</p>")
    skema = {"@context": "https://schema.org", "@type": "FAQPage",
             "mainEntity": [{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": a}}
                            for q, a in pairs]}
    return "\n".join(h) + '\n<script type="application/ld+json">\n' + json.dumps(skema, ensure_ascii=False, indent=1) + "</script>\n"


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 urllib.error.HTTPError as e:
            return {"__err": e.code}
        except Exception:
            time.sleep(4)
    return {}


def hitung(t):
    h = html.unescape(re.sub(r"<[^>]+>", " ", re.sub(r"<script.*?</script>", " ", t, flags=re.S)))
    return len([w for w in re.split(r"\s+", h) if w])


print("=== rencana ===")
for pid in T:
    d = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,slug,content")
    raw = d.get("content", {}).get("raw", "")
    faq_ada = bool(re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I)) or "FAQPage" in raw
    markdown = len(re.findall(r"<h[23][^>]*>\s*#+\s", raw))
    print(f"   #{pid} /{d.get('slug','?')[:40]:<42} {hitung(raw):>4} → {hitung(raw) + hitung(T[pid] + blok_faq(F[pid])):>4} kata | "
          f"FAQ: {'ada (dilewati)' if faq_ada else 'ditambah'} | heading ber-markdown: {markdown}")

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

print("\n=== menulis ===")
for pid in T:
    d = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,slug,content")
    raw = d["content"]["raw"]
    open(f"{BACKUP}/post_{pid}.txt", "w").write(raw)
    anchor = (re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I) or re.search(r"<h2[^>]*>\s*Kesimpulan\s*</h2>", raw, re.I))
    sisip = T[pid]
    if not (re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I) or "FAQPage" in raw):
        sisip += "\n" + blok_faq(F[pid])
    baru = (raw[:anchor.start()] + sisip + "\n" + raw[anchor.start():]) if anchor else (raw.rstrip() + "\n" + sisip)
    # rapikan heading yang masih menyimpan markdown "## "
    n_md = len(re.findall(r"(<h[23][^>]*>)\s*#+\s*", baru))
    baru = re.sub(r"(<h[23][^>]*>)\s*#+\s*", r"\1", baru)
    rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"content": baru})
    cek = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw2 = cek.get("content", {}).get("raw", "") if isinstance(cek, dict) else ""
    print(f"   #{pid} /{d['slug'][:36]:<38} → {hitung(raw2):>4} kata | FAQPage: {'ada' if 'FAQPage' in raw2 else 'tidak'} | "
          f"markdown dibersihkan: {n_md} | re-read: {'✅' if raw2 == baru else '⚠️'}")

print("\n=== verifikasi live ===")
time.sleep(3)
for pid in T:
    d = rest(f"/wp-json/wp/v2/posts/{pid}?_fields=link")
    url = d.get("link", "")
    try:
        hh = urllib.request.urlopen(urllib.request.Request(f"{url}?v={int(time.time())}", headers=UA), timeout=90).read().decode("utf-8", "replace")
        t = re.search(r"<title>(.*?)</title>", hh, re.S)
        sisa_md = len(re.findall(r"<h[23][^>]*>\s*#+", hh))
        print(f"   {url.replace('https://www.theskincodeclinic.com', '')[:48]:<50} FAQPage: {hh.count('FAQPage')} | "
              f"heading '#': {sisa_md} | {t.group(1).strip()[:38] if t else '-'}")
    except Exception as e:
        print(f"   {url}: gagal {str(e)[:40]}")
