#!/usr/bin/env python3
"""TSC batch 3 lanjutan — tambahkan blok FAQ + schema pada 4 artikel yang belum punya
(sesuai references/thin-content-expansion.md: 3-4 bagian + FAQ(5) → 600-900 kata)."""
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)

FAQ = {}
FAQ[1716] = [
 ("Apakah dokter kulit terdekat selalu pilihan terbaik?",
  "Belum tentu. Jarak memudahkan Anda datang untuk kontrol, tetapi yang lebih menentukan adalah siapa yang memeriksa dan bagaimana alur kerjanya. Pilih klinik yang tindakannya didahului pemeriksaan oleh dokter spesialis kulit dan kelamin."),
 ("Apa yang perlu disiapkan pada kunjungan pertama?",
  "Catat keluhan utama dan kapan mulai muncul, bawa daftar produk atau obat yang pernah dipakai, dan sebutkan riwayat alergi. Bila ada foto kondisi sebelumnya atau hasil pemeriksaan lain, bawa sebagai bahan pembanding."),
 ("Apakah keluhan kulit ringan perlu diperiksa ke dokter?",
  "Tidak semua. Keluhan ringan yang muncul sesekali masih bisa dijaga dengan perawatan harian. Namun bila menetap lebih dari dua minggu, menyebar, terasa nyeri, atau mengganggu tidur, sebaiknya diperiksa."),
 ("Apakah konsultasi selalu berakhir dengan tindakan?",
  "Tidak. Konsultasi bisa berhenti pada diagnosis dan rencana perawatan, misalnya dengan obat dan penyesuaian perawatan harian. Tindakan seperti peeling atau laser diberikan bila memang sesuai dengan kondisi kulit Anda."),
 ("Bagaimana cara memastikan biaya sebelum berobat?",
  "Mintalah penjelasan rincian sebelum tindakan dilakukan: jenis pemeriksaan, tindakan yang diusulkan, dan perkiraan jumlah kunjungan. Klinik yang baik tidak keberatan menjelaskan hal ini lebih dulu."),
]
FAQ[1669] = [
 ("Apa bedanya dokter kulit spesialis dengan perawatan estetik biasa?",
  "Dokter spesialis kulit dan kelamin memeriksa dan menegakkan diagnosis lebih dulu, lalu memilih tindakan yang sesuai kondisi kulit. Perawatan estetik tanpa pengawasan dokter umumnya langsung menawarkan tindakan, sehingga risiko pada kulit yang sedang meradang lebih besar."),
 ("Berapa lama hasil perawatan kulit biasanya terlihat?",
  "Bergantung keluhannya. Infeksi jamur umumnya dievaluasi pada dua sampai empat minggu, sedangkan jerawat dinilai setelah enam sampai delapan minggu karena mengikuti siklus pergantian kulit. Pigmentasi sering memerlukan waktu lebih panjang."),
 ("Apakah perawatan harus dilanjutkan di rumah?",
  "Ya. Hasil tindakan di klinik bertahan lebih lama bila perawatan harian dijaga: pembersih lembut, pelembap, dan tabir surya setiap hari. Hindari produk dengan scrub kasar selama masa pemulihan."),
 ("Apakah semua keluhan kulit memerlukan tindakan mesin?",
  "Tidak. Banyak keluhan cukup ditangani dengan obat dan penyesuaian perawatan harian. Tindakan seperti laser atau microneedling dipilih bila indikasinya sesuai, misalnya untuk bekas jerawat atau tekstur kulit."),
 ("Bagaimana cara membuat janji temu?",
  "Hubungi kontak resmi klinik untuk memilih waktu kunjungan. Membuat janji lebih dulu membuat waktu konsultasi tidak terpotong antrean, terutama pada jam sibuk."),
]
FAQ[1744] = [
 ("Apakah konsultasi kelamin dijamin kerahasiaannya?",
  "Kerahasiaan adalah bagian dari standar layanan dan wajar untuk ditanyakan sebelum Anda memutuskan. Tanyakan bagaimana catatan pemeriksaan disimpan dan siapa yang memiliki akses ke data tersebut."),
 ("Apakah semua keluhan kelamin menular?",
  "Tidak. Sebagian keluhan disebabkan infeksi menular, sebagian lagi karena iritasi, alergi, atau kondisi kulit lain. Karena tampak serupa, pemeriksaan dokter diperlukan untuk memastikan penyebabnya."),
 ("Berapa lama pengobatan biasanya berjalan?",
  "Durasi berbeda untuk setiap kondisi. Sebagian keluhan membaik dalam hitungan hari dengan pengobatan yang tepat, sebagian memerlukan pemantauan beberapa minggu. Dokter akan menjelaskan jadwal evaluasi untuk kondisi Anda."),
 ("Apakah pasangan perlu ikut diperiksa?",
  "Pada keluhan tertentu yang menular, memeriksa pasangan dianjurkan agar tidak terjadi penularan berulang. Dokter akan menjelaskan apakah kondisi Anda termasuk yang memerlukan langkah tersebut."),
 ("Bolehkah datang tanpa membuat janji terlebih dahulu?",
  "Bisa, tetapi membuat janji lebih dulu sangat dianjurkan agar waktu tunggu lebih singkat dan sesi konsultasi berjalan lebih optimal."),
]
FAQ[1747] = [
 ("Apa arti gelar Sp.DVE?",
  "Sp.DVE adalah gelar spesialis dermatologi dan venereologi, yaitu bidang yang menangani penyakit kulit, rambut, kuku, serta penyakit menular seksual. Gelar ini menandakan pendidikan spesialis lanjutan di bidang tersebut."),
 ("Apakah dokter kulit juga menangani keluhan kelamin?",
  "Ya. Dokter spesialis kulit dan kelamin menangani kedua bidang itu, termasuk keluhan pada area kelamin yang memerlukan pemeriksaan dan penanganan khusus."),
 ("Keluhan apa saja yang bisa dikonsultasikan?",
  "Jerawat dan bekasnya, eksim serta dermatitis, alergi kulit, infeksi jamur, keluhan pigmentasi, hingga keluhan kulit dan kelamin lain. Tindakan estetika medis juga tersedia bila sesuai indikasi."),
 ("Apakah pemeriksaan dilakukan lebih dulu sebelum tindakan?",
  "Seharusnya begitu. Pada praktik yang baik, setiap tindakan didahului pemeriksaan untuk memastikan diagnosis dan menyesuaikan pilihan tindakan dengan kondisi kulit pasien."),
 ("Bagaimana cara membuat janji temu?",
  "Hubungi kontak resmi klinik dan sebutkan keluhan utama Anda. Membuat janji lebih dulu membantu Anda mendapat waktu konsultasi yang cukup, bukan sekadar antrean singkat."),
]


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("=== menambahkan blok FAQ + schema pada artikel yang belum punya ===")
for pid, pairs in FAQ.items():
    d = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,slug,content")
    raw = d.get("content", {}).get("raw", "")
    if "FAQPage" in raw or re.search(r"<h2[^>]*>\s*FAQ\s*</h2>", raw, re.I):
        print(f"   #{pid} sudah punya FAQ — dilewati")
        continue
    open(f"{BACKUP}/post_{pid}_sebelum_faq.txt", "w").write(raw)
    baru = raw.rstrip() + "\n" + blok_faq(pairs)
    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'][:38]:<40} {hitung(raw):>4} → {hitung(raw2):>4} kata | "
          f"FAQPage: {'✅' if 'FAQPage' in raw2 else '❌'} | re-read cocok: {'✅' if raw2 == baru else '⚠️'}")

print("\n=== verifikasi live ===")
time.sleep(3)
for pid in FAQ:
    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")
        print(f"   {url.replace('https://www.theskincodeclinic.com', '')[:52]:<54} FAQPage: {hh.count('FAQPage')} | domain lama: {hh.count('klinikdnisidoarjo')}")
    except Exception as e:
        print(f"   {url}: gagal {str(e)[:40]}")
