#!/usr/bin/env python3
"""TSC — artikel harian: «Dermatolog atau Dokter Kulit: Apa Bedanya dan Mana yang Anda Butuhkan».

Topik dari tsc_topik_bank.json (entri pertama yang belum dipakai). Sudah disaring
tsc_cek_topik.py: aman, skor tertinggi 0,12 ke #9069 (ambang 0,30).
Sudut: perbedaan istilah dan kewenangan, bukan daftar klinik kecantikan.

Alur: draf (REST) -> gambar unggulan (desain sendiri, 1000x567 webp) -> meta Yoast
(XML-RPC, kirim ulang seluruh custom field) -> jadwalkan 2026-10-26 08:00 WIB
(zona situs UTC, jadi 01:00).

Pakai --apply untuk benar-benar mengerjakan.
"""
import json
import os
import re
import sys
import time

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from tsc_http import CFG, rest_json, xmlrpc_call  # noqa: E402

DOM = CFG["domain"]
USER, SANDI = CFG["user"], CFG["pass"]

JUDUL = "Dermatolog atau Dokter Kulit: Apa Bedanya dan Mana yang Anda Butuhkan"
SLUG = "dermatolog-atau-dokter-kulit-apa-bedanya"
FOKUS = "dermatolog"
META_JUDUL = "Dermatolog atau Dokter Kulit: Apa Bedanya?"
META_DESC = ("Istilah dermatolog dan dokter kulit sering dipakai bergantian. Kenali bedanya, "
             "kewenangan masing-masing, dan kapan Anda perlu ke dokter spesialis.")
TANGGAL = "2026-10-26T01:00:00"   # 08:00 WIB (zona situs UTC)
GAMBAR = f"{WS}/tsc_feat_dermatolog_dokter_kulit.webp"
ALT_GAMBAR = "Ilustrasi artikel dermatolog atau dokter kulit di The Skin Code Clinic Krian"

WA = ("https://wa.me/6285117444417?text=Saya%20ingin%20konsultasi%20masalah%20kulit%20di%20The%20Skin"
      "%20Code%20Clinic")
TOMBOL = ('<p style="text-align:center;margin:32px 0 8px"><a class="wp-block-button__link '
          'wp-element-button" href="' + WA + '" target="_blank" rel="noopener" '
          'style="display:inline-block;background-color:#0f2557;color:#ffffff;padding:15px 34px;'
          'font-size:18px;font-weight:bold;text-decoration:none;border-radius:6px;">'
          'KONSULTASI GRATIS</a></p>')

ISI = """
<p>Anda mengetik kata dermatolog di mesin pencari, lalu muncul sepuluh klinik dengan sebutan berbeda.
Ada yang menulis dermatolog, ada yang menulis dokter kulit, ada pula yang menulis dokter spesialis
kulit dan kelamin. Ketiganya terdengar sama, padahal tidak selalu merujuk pada hal yang sama.</p>

<p>Kebingungan ini masuk akal. Kata dermatolog diserap dari bahasa Inggris dermatologist. Di Indonesia,
sebutan resmi profesi ini tidak memakai kata itu, dan gelarnya sempat berganti dalam beberapa tahun
terakhir. Bagi Anda yang sedang mencari penanganan, yang lebih penting bukan hafalan gelar, melainkan
tahu siapa yang paling tepat untuk keluhan yang Anda bawa.</p>

<h2>Dari mana istilah dermatolog berasal</h2>
<p>Dermatolog dibentuk dari dua kata Yunani, derma yang berarti kulit dan logos yang berarti ilmu.
Dalam pemakaian bahasa Inggris, dermatologist adalah dokter yang menangani kulit, rambut, kuku, dan
selaput lendir. Istilah ini kemudian dipakai luas di media, iklan klinik, dan percakapan sehari-hari
di Indonesia.</p>

<p>Gelar resmi yang tercantum di Indonesia adalah Sp.D.V., singkatan dari Dokter Spesialis Dermatologi
dan Venereologi. Sebelumnya sebutan yang berlaku adalah Sp.KK, dokter spesialis kulit dan kelamin.
Perubahan itu mengikuti penyesuaian nama program studi dan organisasi profesi, bukan perubahan
wilayah kerja. Artinya, dokter yang lulus dengan gelar lama dan dokter yang lulus dengan gelar baru
sama-sama menangani penyakit kulit serta infeksi menular seksual.</p>

<p>Karena itu, klinik yang menulis dermatolog seharusnya merujuk pada dokter dengan kompetensi di
bidang dermatologi. Yang perlu Anda pastikan, apakah dokter tersebut benar-benar spesialis D.V. atau
dokter umum yang menempuh pelatihan estetika. Dua-duanya boleh membuka praktik, tetapi batas
kewenangannya berbeda.</p>

<h2>Batas yang jelas antara dokter umum dan dokter spesialis</h2>
<p>Semua dokter lulusan fakultas kedokteran berwenang memeriksa keluhan kulit. Dokter umum menangani
hal yang sering ditemui sehari-hari: jerawat ringan, biang keringat, gigitan serangga, panu, kutu air,
dan luka lecet. Untuk keluhan seperti itu, kunjungan ke dokter umum atau klinik terdekat biasanya
sudah memadai.</p>

<p>Dokter spesialis D.V. menempuh pendidikan lanjutan setelah menyelesaikan pendidikan dokter umum.
Di tahap itu mereka mendalami cara membedakan penyakit kulit yang tampak mirip, prosedur seperti
dermoskopi dan kerokan kulit, uji tempel untuk alergi kulit, penanganan infeksi jamur yang membandel,
kelainan kulit bawaan, sampai penyakit menular seksual. Bekal inilah yang dipakai ketika keluhan tidak
merespons pengobatan biasa.</p>

<p>Perbedaan paling terasa pada kasus yang berlarut. Jerawat yang sudah dicoba berbagai produk selama
setahun, ruam yang berpindah tempat, atau bercak yang berubah warna biasanya membutuhkan mata yang
terbiasa melihat pola serupa setiap hari. Dokter umum yang jujur akan merujuk kasus seperti ini, dan
rujukan semacam itu justru menandakan penilaian yang hati-hati, bukan tanda ketidakmampuan.</p>

<h2>Keluhan yang sebaiknya langsung ke dokter spesialis</h2>
<p>Ada beberapa keadaan yang tidak perlu dicoba ditangani sendiri lebih dulu. Bercak kulit yang
berubah bentuk, warna, atau ukuran dalam hitungan minggu perlu diperiksa, terutama jika tepinya tidak
rata atau berdarah tanpa sebab. Luka yang tidak menutup setelah berminggu-minggu, rambut rontok yang
menyisakan area botak, dan kuku yang menebal atau berubah bentuk juga layak diperiksa.</p>

<p>Keluhan kulit yang disertai demam, nyeri hebat, atau melepuh cepat termasuk keadaan yang dicari
bantuannya hari itu juga. Begitu pula reaksi luas setelah memakai obat baru. Kulit yang memerah dan
luka di area yang sama terus menerus, meski sudah dirawat, patut dipertimbangkan untuk diperiksa lebih
teliti. Jerawat yang selalu muncul di area sama menjelang haid juga punya pola yang bisa dilacak
lewat pemeriksaan.</p>

<ul>
<li>Bercak atau tahi lalat yang berubah ukuran dan warna.</li>
<li>Ruam yang meluas cepat atau disertai demam.</li>
<li>Luka dan garukan yang tidak menutup setelah dua minggu.</li>
<li>Rambut rontok yang membuat area kulit kepala terlihat.</li>
<li>Keluhan yang kembali setiap kali obat dihentikan.</li>
</ul>

<h2>Dokter lain yang kadang ikut menangani</h2>
<p>Kulit bukan wilayah kerja satu spesialisasi saja. Tindakan bedah seperti pengangkatan kista,
koreksi bekas luka, atau pengambilan jaringan untuk pemeriksaan dilakukan oleh dokter spesialis bedah,
sering kali setelah diagnosis ditegakkan dokter D.V. Anak dengan keluhan kulit tertentu ditangani
bersama dokter spesialis anak, terutama jika keluhannya sudah ada sejak lahir atau disertai gangguan
tumbuh kembang.</p>

<p>Keluhan kulit yang berkaitan dengan hormon, misalnya jerawat hebat disertai siklus haid tidak
teratur atau pertumbuhan rambut berlebih, bisa melibatkan dokter spesialis obstetri dan ginekologi
atau penyakit dalam. Pada kasus seperti ini, penanganan kulit berjalan bersama penanganan sumber
masalahnya. Hasil yang bertahan biasanya datang dari keduanya, bukan dari krim saja.</p>

<h2>Cara memilih tempat konsultasi</h2>
<p>Sebelum mendaftar, perhatikan gelar yang dicantumkan di halaman profil dokter. Gelar Sp.D.V. atau
Sp.KK menunjukkan dokter spesialis. Kalau tidak ada gelar apa pun, ada kemungkinan Anda akan diperiksa
dokter umum. Itu tidak salah untuk keluhan ringan, tetapi sebaiknya Anda tahu sejak awal.</p>

<p>Tanyakan juga siapa yang melakukan tindakan. Di sebagian klinik, konsultasi dilakukan dokter
spesialis sementara tindakan dijalankan perawat atau terapis. Untuk perawatan ringan hal ini biasa,
tetapi untuk tindakan yang menyentuh kulit lebih dalam, sebaiknya dilakukan dokter.</p>

<p>Hal lain yang layak diperhatikan adalah penjelasan yang Anda terima. Klinik yang terbuka akan
menyebut kemungkinan efek samping, perkiraan jumlah kunjungan, perkiraan biaya, dan pilihan lain yang
tersedia. Kalau penjelasannya hanya soal hasil tanpa menyebut risikonya, sebaiknya Anda berhenti dan
mencari pendapat kedua. Rincian biaya konsultasi di wilayah Sidoarjo bisa dilihat di halaman
<a href="https://www.theskincodeclinic.com/biaya-dokter-kulit-sidoarjo/">biaya dokter kulit
Sidoarjo</a>, sementara alur kunjungan dijelaskan di halaman
<a href="https://www.theskincodeclinic.com/praktik-dokter-kulit-krian-jadwal-alur/">praktik dokter
kulit Krian</a>.</p>

<p>Saat datang, bawa daftar produk yang pernah dipakai, obat rutin termasuk suplemen, dan riwayat
alergi keluarga. Kalau memungkinkan, datang tanpa riasan di area yang dikeluhkan dan tanpa mengoles
krim sehari sebelumnya, agar kondisi kulit terlihat apa adanya. Catatan tanggal mulai keluhan juga
membantu, terutama kalau keluhannya datang dan pergi. Jam praktik dan cara mendaftar bisa dicek di
halaman <a href="https://www.theskincodeclinic.com/dokter-kulit-sidoarjo-buka-sekarang-jam-praktik/">jam
praktik dokter kulit Sidoarjo</a>.</p>

""" + TOMBOL + """

<h2>Pertanyaan yang sering diajukan</h2>

<h3>Apakah dermatolog sama dengan dokter estetika?</h3>
<p>Kedua sebutan itu tidak selalu sama. Dokter estetika adalah sebutan longgar untuk dokter yang
menekuni tindakan kecantikan, dan bisa berasal dari dokter umum dengan pelatihan tambahan.
Dermatolog dalam arti sebenarnya adalah dokter spesialis dermatologi dan venereologi, yang
kewenangannya mencakup diagnosis penyakit kulit.</p>

<h3>Apakah perlu surat rujukan untuk ke dokter spesialis kulit?</h3>
<p>Untuk praktik mandiri dan klinik, Anda bisa mendaftar langsung tanpa rujukan. Rujukan baru
diperlukan kalau Anda berobat lewat jalur jaminan kesehatan nasional di fasilitas tingkat lanjut,
karena alurnya berjenjang dari puskesmas atau klinik pertama.</p>

<h3>Apakah keluhan kulit bisa selesai dalam satu kunjungan?</h3>
<p>Sebagian bisa, misalnya infeksi jamur ringan atau jerawat tahap awal. Keluhan yang sudah lama,
melibatkan alergi, atau butuh perawatan berkala umumnya memerlukan kontrol beberapa kali. Dokter
biasanya menyebut perkiraan jumlah kunjungan setelah melihat respons awal pengobatan.</p>

<h3>Apakah tindakan di klinik estetika sama dengan di rumah sakit?</h3>
<p>Belum tentu. Perbedaannya terletak pada jenis tindakan yang tersedia, fasilitas penunjang, dan
kemampuan menangani komplikasi. Tindakan ringan seperti pembersihan wajah bisa dilakukan di banyak
tempat. Tindakan yang memakai alat laser, suntikan, atau sayatan sebaiknya dilakukan di tempat yang
punya fasilitas penanganan darurat dan dokter yang berwenang.</p>

<p>Memilih tempat periksa kulit sebaiknya tidak didasarkan pada istilah yang paling meyakinkan di
iklan, melainkan pada kesesuaian antara keluhan Anda dan kewenangan dokter yang menanganinya. Untuk
keluhan ringan, dokter umum sudah cukup. Untuk keluhan yang berlarut, berulang, atau mengubah bentuk
kulit, dokter spesialis D.V. memberi kepastian yang lebih besar.</p>

<p>Di The Skin Code Clinic Krian, pemeriksaan diawali dengan menelusuri riwayat keluhan dan melihat
kondisi kulit Anda langsung, sehingga arah penanganan mengikuti penyebabnya. Kalau Anda masih ragu
apakah keluhan Anda perlu ditangani dokter umum atau dokter spesialis, tanyakan dulu lewat tombol di
atas.</p>
"""


def baca(p, method="GET", data=None):
    st, d = rest_json(method, p, data=data)
    return st, d


teks = re.sub(r"<[^>]+>", " ", ISI)
kata = len(teks.split())
print(f"=== {JUDUL}")
print(f"   kata: {kata} (target 1.000-1.300)")
print(f"   meta judul: {len(META_JUDUL)} char (maks 60) · meta desc: {len(META_DESC)} char (140-158)")
print(f"   tombol WA: {'ada' if 'wa.me' in ISI else 'TIDAK ADA'}")
print(f"   tautan internal: {len(re.findall('theskincodeclinic.com', ISI))}")
print(f"   sub-judul H2: {ISI.count('<h2')} · H3: {ISI.count('<h3')}")
print(f"   tanggal jadwal: {TANGGAL} (08:00 WIB)")

if kata < 1000 or kata > 1300:
    sys.exit("   PANJANG TIDAK SESUAI BAKU - perbaiki dulu")
if len(META_JUDUL) > 60 or not (140 <= len(META_DESC) <= 158):
    sys.exit("   META TIDAK SESUAI BAKU - perbaiki dulu")

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

# ---------- 1. buat draf ----------
st, d = baca("/wp-json/wp/v2/posts", "POST", {"title": JUDUL, "slug": SLUG, "content": ISI,
                                              "status": "draft", "comment_status": "closed"})
if not isinstance(d, dict) or "id" not in d:
    sys.exit(f"   GAGAL buat draf: {st} {str(d)[:200]}")
PID = d["id"]
print(f"\n[1] draf #{PID} -> {d.get('link')} · status={d.get('status')}")

# ---------- 2. gambar unggulan ----------
try:
    from PIL import Image, ImageDraw, ImageFont
    FONTS = os.path.expanduser("~/.fonts")
    NAVY, BIRU, ABU, PUTIH = (11, 31, 58), (30, 64, 175), (100, 116, 139), (255, 255, 255)
    W, H, PAD = 1000, 567, 62
    f = lambda n, s: ImageFont.truetype(os.path.join(FONTS, n), s)

    def bungkus(t, font, maks):
        baris, kini = [], ""
        for k in t.split():
            c = (kini + " " + k).strip()
            if font.getlength(c) <= maks:
                kini = c
            else:
                if kini:
                    baris.append(kini)
                kini = k
        if kini:
            baris.append(kini)
        return baris

    img = Image.new("RGB", (W, H), PUTIH)
    dr = ImageDraw.Draw(img)
    panel = int(W * 0.34)
    dr.rectangle([W - panel, 0, W, H], fill=BIRU)
    for i, r in enumerate((150, 110, 70)):
        x, y = W - panel // 2, H // 2
        dr.ellipse([x - r, y - r, x + r, y + r], outline=PUTIH, width=3 if i == 2 else 2)
    dr.rectangle([W - panel // 2 - 34, H // 2 - 12, W - panel // 2 + 34, H // 2 + 12], fill=PUTIH)
    dr.rectangle([W - panel // 2 - 12, H // 2 - 34, W - panel // 2 + 12, H // 2 + 34], fill=PUTIH)
    dr.rectangle([0, 0, 10, H], fill=BIRU)
    dr.text((PAD, PAD - 6), "THE SKIN CODE CLINIC", font=f("Poppins-SemiBold.ttf", 24), fill=BIRU)
    dr.text((PAD, PAD + 26), "Krian, Sidoarjo", font=f("Poppins-Regular.ttf", 20), fill=ABU)
    maks = W - panel - PAD - 46
    y = 150
    for b in bungkus("Dermatolog atau Dokter Kulit", f("Poppins-Bold.ttf", 52), maks):
        dr.text((PAD, y), b, font=f("Poppins-Bold.ttf", 52), fill=NAVY)
        y += 64
    y += 4
    for b in bungkus("Mana yang Anda butuhkan", f("Poppins-Regular.ttf", 25), maks):
        dr.text((PAD, y), b, font=f("Poppins-Regular.ttf", 25), fill=ABU)
        y += 35
    dr.rectangle([PAD, H - 96, PAD + 74, H - 92], fill=BIRU)
    dr.text((PAD, H - 78), "theskincodeclinic.com", font=f("Poppins-SemiBold.ttf", 23), fill=NAVY)
    dr.text((PAD, H - 46), "Konsultasi lewat WhatsApp · 0851-1744-4417",
            font=f("Poppins-Regular.ttf", 20), fill=ABU)
    img.save(GAMBAR, "WEBP", quality=92, method=6)
    print(f"[2] gambar: {GAMBAR} {img.size} {os.path.getsize(GAMBAR)//1024} KB")

    data = open(GAMBAR, "rb").read()
    nama = os.path.basename(GAMBAR)
    stm, med = rest_json("POST", "/wp-json/wp/v2/media", binary=data, content_type="image/webp",
                         extra_headers={"Content-Disposition": f'attachment; filename="{nama}"'})
    if not isinstance(med, dict) or "id" not in med:
        raise RuntimeError(f"unggah media gagal: {stm} {str(med)[:200]}")
    print(f"    unggah media #{med['id']} -> {med.get('source_url')}")
    baca(f"/wp-json/wp/v2/media/{med['id']}", "POST",
         {"alt_text": ALT_GAMBAR, "title": f"Gambar unggulan: {JUDUL}"})
    baca(f"/wp-json/wp/v2/posts/{PID}", "POST", {"featured_media": med["id"]})
    time.sleep(2)
    _, cekp = baca(f"/wp-json/wp/v2/posts/{PID}?context=edit&_fields=featured_media")
    print(f"    featured_media tersimpan: {cekp.get('featured_media') if isinstance(cekp, dict) else cekp}")
    _, cekm = baca(f"/wp-json/wp/v2/media/{med['id']}?context=edit&_fields=alt_text")
    print(f"    alt_text tersimpan: {str(cekm)[:160]}")
except Exception as e:
    print(f"[2] gambar unggulan GAGAL: {str(e)[:200]} - lanjut tanpa gambar")

# ---------- 3. meta Yoast via XML-RPC (kirim ulang seluruh custom field) ----------
try:
    p = xmlrpc_call("wp.getPost", [0, USER, SANDI, PID])
    cf = p.get("custom_fields", [])
    print(f"[3] custom field lama: {len(cf)} -> {[x.get('key') for x in cf]}")
    baru = {x["key"]: x["value"] for x in cf}
    baru["_yoast_wpseo_title"] = META_JUDUL
    baru["_yoast_wpseo_metadesc"] = META_DESC
    baru["_yoast_wpseo_focuskw"] = FOKUS
    kirim = [{"key": k, "value": v} for k, v in baru.items()]
    xmlrpc_call("wp.editPost", [0, USER, SANDI, PID, {"custom_fields": kirim}])
    time.sleep(2)
    p2 = xmlrpc_call("wp.getPost", [0, USER, SANDI, PID])
    v = {x["key"]: x["value"] for x in p2.get("custom_fields", [])}
    print(f"    tersimpan: title={v.get('_yoast_wpseo_title')!r}")
    print(f"               desc={v.get('_yoast_wpseo_metadesc')!r}")
    print(f"               focuskw={v.get('_yoast_wpseo_focuskw')!r}")
    print(f"    jumlah field setelah tulis: {len(v)}")
except Exception as e:
    print(f"[3] meta Yoast GAGAL: {str(e)[:200]}")

# ---------- 4. jadwalkan ----------
sts, ds = baca(f"/wp-json/wp/v2/posts/{PID}", "POST", {"status": "future", "date": TANGGAL})
print(f"[4] jadwalkan: HTTP {sts}")
time.sleep(3)
_, akhir = baca(f"/wp-json/wp/v2/posts/{PID}?context=edit"
                f"&_fields=id,status,date,date_gmt,slug,link,featured_media,title")
if isinstance(akhir, dict):
    print(f"    status={akhir.get('status')} · date={akhir.get('date')} · slug={akhir.get('slug')}")
    print(f"    featured_media={akhir.get('featured_media')}")
    _, isi = baca(f"/wp-json/wp/v2/posts/{PID}?context=edit&_fields=content")
    html = ((isi or {}).get("content") or {}).get("raw", "") if isinstance(isi, dict) else ""
    print(f"    isi: {len(html)} char · tombol WA: "
          f"{'ada' if 'wa.me/6285117444417' in html else 'TIDAK ADA'} · sub-judul h2: {html.count('<h2')}")
else:
    print(f"    baca balik gagal: {akhir}")
print(f"\npost #{PID} · {akhir.get('link') if isinstance(akhir, dict) else ''}")
print("JSON:", json.dumps({"id": PID, "slug": (akhir or {}).get("slug") if isinstance(akhir, dict) else None,
                           "date": (akhir or {}).get("date") if isinstance(akhir, dict) else None,
                           "status": (akhir or {}).get("status") if isinstance(akhir, dict) else None}))
