#!/usr/bin/env python3
"""TSC batch 5 — 5 artikel. Ikuti playbook §6. Tidak menambah klaim pemasaran baru
(tanpa angka, tanpa sertifikasi, tanpa janji hasil). Tambah FAQ+schema bila belum ada.
Bonus: perbaiki salah ketik 'Manyar' → 'Banyak' pada #9260.
"""
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[1908] = """<h2>Cara menilai klinik kulit sebelum memutuskan</h2>
<p>Ada tiga hal yang layak diperiksa. Pertama, siapa yang memeriksa: dokter spesialis kulit dan kelamin, atau petugas yang menjalankan tindakan. Kedua, apakah setiap tindakan didahului pemeriksaan dan diagnosis. Ketiga, apakah klinik menjelaskan pilihan tindakan beserta risikonya, termasuk kemungkinan hasil yang perlu perawatan lanjutan.</p>
<p>Klinik yang bekerja dengan urutan ini akan memberi Anda rencana perawatan tertulis: apa diagnosisnya, tindakan apa yang diusulkan, berapa perkiraan jumlah kunjungan, dan bagaimana hasilnya dievaluasi.</p>
<h2>Pertanyaan yang sebaiknya diajukan sebelum tindakan</h2>
<p>Sebelum menyetujui tindakan, tanyakan: apa diagnosisnya, apakah ada pilihan selain tindakan tersebut, apa risikonya untuk jenis kulit Anda, bagaimana perawatan setelah tindakan, dan kapan hasilnya dievaluasi. Pertanyaan ini wajar dan klinik yang baik tidak keberatan menjawabnya.</p>
<h2>Tanda yang perlu diwaspadai</h2>
<ul>
<li>Menjanjikan hasil permanen tanpa risiko untuk semua kondisi kulit.</li>
<li>Menawarkan paket tindakan sebelum kulit Anda diperiksa.</li>
<li>Menekan keputusan dengan batas waktu atau diskon yang mendesak.</li>
<li>Tidak bersedia menjelaskan siapa yang akan melakukan tindakan.</li>
<li>Tidak memberi penjelasan tertulis mengenai perawatan setelah tindakan.</li>
</ul>
<p>Tidak ada tindakan medis yang bebas risiko sepenuhnya. Dokter yang jujur akan menjelaskan peluang hasil, kemungkinan efek samping, dan langkah yang diambil bila hasilnya tidak sesuai harapan.</p>
"""

F[1908] = [
 ("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."),
]

T[1647] = """<h2>Keluhan yang paling sering datang</h2>
<p>Dari sisi kulit, keluhan yang paling banyak datang adalah jerawat dan bekasnya, eksim serta dermatitis, alergi kulit, infeksi jamur, dan pigmentasi. Dari sisi kelamin, penanganan mencakup keluhan menular maupun yang disebabkan iritasi. Selain itu, pasien datang untuk kebutuhan estetika medis seperti perbaikan tekstur kulit dan kulit kusam.</p>
<h2>Alur konsultasi dari keluhan sampai rencana perawatan</h2>
<p>Kunjungan dimulai dengan menceritakan keluhan dan riwayat pemakaian produk. Setelah itu dokter memeriksa kulit langsung, dan bila perlu meminta pemeriksaan penunjang sederhana seperti kerokan kulit untuk infeksi jamur. Hasilnya berupa rencana perawatan yang memuat diagnosis, pilihan obat atau tindakan, perawatan harian, dan jadwal evaluasi.</p>
<p>Tahap evaluasi bukan formalitas. Pada kunjungan lanjutan, dokter menilai apakah perawatan berjalan sesuai harapan atau perlu disesuaikan.</p>
<h2>Kapan sebaiknya memeriksakan keluhan</h2>
<p>Periksakan lebih awal bila keluhan menetap lebih dari dua minggu, menyebar, terasa nyeri atau panas, muncul lepuhan atau luka terbuka, atau muncul setelah memakai obat dan produk baru. Untuk keluhan kelamin, jangan menunggu nyeri karena beberapa kondisi lebih mudah ditangani pada tahap awal.</p>
"""

F[1647] = [
 ("Layanan apa saja yang tersedia di klinik kulit dan kelamin?",
  "Konsultasi dan penanganan keluhan kulit, penanganan keluhan kelamin, serta tindakan estetika medis seperti perawatan wajah medis, peeling, microneedling, dan laser. Pilihan tindakan disesuaikan dengan diagnosis."),
 ("Bagaimana cara memilih klinik kulit yang tepat di Krian?",
  "Periksa siapa yang memeriksa, apakah tindakan didahului diagnosis, dan apakah rincian biaya dijelaskan sebelum tindakan. Klinik yang baik bersedia menjelaskan ketiganya tanpa diminta berulang kali."),
 ("Apakah konsultasi harus dengan janji terlebih dahulu?",
  "Sangat dianjurkan. Dengan janji, waktu konsultasi Anda tidak terpotong antrean dan dokter bisa menyiapkan waktu yang cukup untuk memeriksa keluhan Anda."),
 ("Apakah keluhan kelamin dijaga 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."),
 ("Berapa lama penanganan biasanya berjalan?",
  "Bervariasi. Infeksi jamur umumnya dievaluasi dalam dua sampai empat minggu, jerawat dalam enam sampai delapan minggu, sedangkan pigmentasi sering memerlukan waktu lebih panjang."),
]

T[1644] = """<h2>Bedanya perawatan medis dan perawatan estetik</h2>
<p>Perawatan medis dimulai dari diagnosis: keluhan diperiksa, penyebabnya dipastikan, baru ditentukan penanganan. Perawatan estetik menitikberatkan hasil tampilan, misalnya tekstur kulit atau kecerahan. Keduanya bisa berjalan bersamaan, tetapi urutannya penting: tindakan estetik pada kulit yang sedang meradang atau terinfeksi justru berisiko memperburuk kondisi.</p>
<h2>Keluhan yang perlu penanganan dokter</h2>
<p>Beberapa keluhan sebaiknya tidak ditangani sendiri: jerawat yang meradang dan berulang, ruam yang menyebar, gatal yang mengganggu tidur, infeksi jamur, keluhan pada area kelamin, serta perubahan pada tahi lalat. Untuk keluhan seperti ini, pemeriksaan dokter menentukan jenis penanganan yang aman.</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. Untuk area yang akan diperiksa, hindari riasan tebal dan jangan mencoba produk baru beberapa hari sebelum kunjungan. Bila ada hasil pemeriksaan sebelumnya, bawa sebagai bahan pertimbangan.</p>
"""

F[1644] = [
 ("Apa yang membedakan klinik kulit medis dan klinik kecantikan biasa?",
  "Klinik kulit medis menempatkan diagnosis sebagai langkah pertama dan tindakannya dilakukan atas indikasi medis. Klinik kecantikan umumnya berfokus pada hasil tampilan dan sering menawarkan tindakan tanpa pemeriksaan lebih dulu."),
 ("Keluhan apa saja yang ditangani?",
  "Keluhan kulit seperti jerawat, eksim, alergi, infeksi jamur, dan pigmentasi; keluhan rambut dan kuku; keluhan kelamin; serta tindakan estetika medis bila indikasinya sesuai."),
 ("Apakah konsultasi bisa tanpa tindakan?",
  "Bisa. Konsultasi dapat berhenti pada diagnosis dan rencana perawatan, misalnya dengan obat dan penyesuaian perawatan harian. Tindakan diberikan bila memang diperlukan."),
 ("Berapa lama hasil perawatan mulai terlihat?",
  "Bergantung keluhan dan jenis perawatan. Sebagian keluhan membaik dalam hitungan minggu, sebagian memerlukan evaluasi berkala. Dokter akan menjelaskan perkiraan untuk kondisi Anda."),
 ("Bagaimana cara membuat janji konsultasi?",
  "Hubungi kontak resmi klinik dan sebutkan keluhan utama Anda. Membuat janji lebih dulu membuat waktu tunggu lebih singkat dan sesi konsultasi lebih optimal."),
]

T[9260] = """<h2>Cara memastikan dokter yang Anda pilih memang spesialis</h2>
<p>Gelar yang perlu dicari adalah Sp.DVE, yaitu spesialis dermatologi dan venereologi. Dokter dengan gelar ini menangani penyakit kulit, rambut, kuku, dan penyakit menular seksual. Selain gelar, perhatikan cara kerjanya: praktik yang baik memulai dari anamnesis dan pemeriksaan, lalu menetapkan tindakan sesuai diagnosis.</p>
<h2>Pertanyaan yang layak diajukan pada konsultasi pertama</h2>
<p>Sebutkan tujuan Anda, lalu tanyakan perkiraan lama perawatan, tanda yang perlu diwaspadai di rumah, dan jadwal kontrol berikutnya. Bila ada beberapa pilihan tindakan, tanyakan mana yang paling sesuai dengan kondisi kulit Anda serta risikonya. Dokter yang baik tidak keberatan menjelaskan ini karena keputusan tetap di tangan pasien.</p>
<h2>Kapan meminta pendapat kedua</h2>
<p>Pendapat kedua masuk akal bila keluhan tidak membaik setelah perawatan dijalankan sesuai anjuran, bila usulan tindakan sangat banyak sekaligus, atau bila penjelasan yang Anda terima terlalu singkat untuk memutuskan. Ini bagian dari keputusan medis yang wajar, bukan tanda tidak percaya.</p>
"""

F[9260] = [
 ("Apa gelar yang menandakan dokter spesialis kulit dan kelamin?",
  "Sp.DVE, singkatan dari spesialis dermatologi dan venereologi. Gelar ini menandakan pendidikan spesialis untuk menangani penyakit kulit, rambut, kuku, dan penyakit menular seksual."),
 ("Apakah dokter umum bisa menangani keluhan kulit?",
  "Bisa untuk keluhan sederhana. Namun bila keluhan menetap, berulang, atau memerlukan tindakan seperti peeling dan laser, penanganan sebaiknya dilakukan dokter spesialis agar diagnosisnya tepat."),
 ("Apa yang sebaiknya ditanyakan saat konsultasi pertama?",
  "Tanyakan diagnosisnya, perkiraan lama perawatan, tanda yang perlu diwaspadai, jadwal kontrol, serta pilihan tindakan beserta risikonya. Pertanyaan ini membantu Anda menilai apakah rencananya sesuai."),
 ("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 tidur, sebaiknya diperiksa."),
 ("Kapan sebaiknya saya meminta pendapat kedua?",
  "Bila keluhan tidak membaik setelah perawatan dijalankan sesuai anjuran, bila usulan tindakan terlalu banyak sekaligus, atau bila Anda merasa penjelasan yang diterima belum cukup untuk memutuskan."),
]

T[8423] = """<h2>Keluhan yang paling sering ditangani</h2>
<p>Keluhan yang paling banyak datang adalah jerawat dan bekasnya, eksim serta dermatitis, alergi kulit, infeksi jamur, dan pigmentasi. Sebagian pasien datang untuk keluhan kelamin, sebagian lagi untuk kebutuhan estetika medis seperti perbaikan tekstur kulit. Apa pun keluhannya, penanganan dimulai dari pemeriksaan, bukan langsung tindakan.</p>
<h2>Berapa lama penanganan biasanya berjalan</h2>
<p>Durasi berbeda untuk setiap keluhan. Infeksi jamur umumnya dievaluasi setelah dua sampai empat minggu pengobatan. Jerawat dinilai perkembangannya setelah enam sampai delapan minggu karena mengikuti siklus pergantian kulit. Keluhan pigmentasi sering memerlukan waktu lebih panjang dan kedisiplinan memakai tabir surya.</p>
<h2>Menyiapkan konsultasi pertama</h2>
<p>Catat keluhan utama dan waktu kemunculannya, bawa daftar produk atau obat yang pernah dipakai, dan sebutkan riwayat alergi. Bila ada foto kondisi sebelumnya, sertakan sebagai pembanding. Untuk area yang akan diperiksa, sebaiknya tidak memakai riasan tebal dan tidak mencoba produk baru beberapa hari sebelum kunjungan.</p>
"""


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
    tamb = T[pid] + ("" if faq_ada else "\n" + blok_faq(F[pid]))
    typo = raw.count("Manyar")
    print(f"   #{pid} /{d.get('slug','?')[:40]:<42} {hitung(raw):>4} → {hitung(raw) + hitung(tamb):>4} kata | "
          f"FAQ: {'ada (tak ditambah)' if faq_ada else 'ditambah'} | typo 'Manyar': {typo}")

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)
    faq_ada = bool(re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I)) or "FAQPage" in raw
    sisip = T[pid] + ("" if faq_ada else "\n" + blok_faq(F[pid]))
    anchor = (re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I) or re.search(r"<h2[^>]*>\s*Kesimpulan\s*</h2>", raw, re.I))
    baru = (raw[:anchor.start()] + sisip + "\n" + raw[anchor.start():]) if anchor else (raw.rstrip() + "\n" + sisip)
    n_typo = baru.count("Manyar")
    baru = baru.replace("Manyar", "Banyak")
    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'][:34]:<36} → {hitung(raw2):>4} kata | FAQPage: {'ada' if 'FAQPage' in raw2 else 'tidak'} | "
          f"typo diperbaiki: {n_typo} | markdown: {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)
        print(f"   {url.replace('https://www.theskincodeclinic.com', '')[:46]:<48} FAQPage: {hh.count('FAQPage')} | "
              f"'Manyar': {hh.count('Manyar')} | {t.group(1).strip()[:36] if t else '-'}")
    except Exception as e:
        print(f"   {url}: gagal {str(e)[:40]}")
