#!/usr/bin/env python3
"""TSC — artikel harian: «Jerawat Hormonal pada Perempuan Dewasa: Penyebab dan Perawatan».

Topik dari tsc_topik_bank.json (entri #1). Sudah disaring tsc_cek_topik.py: aman.
Alur: draf (REST) → gambar unggulan (desain sendiri, 1000x567 webp) → meta Yoast (XML-RPC,
kirim ulang seluruh custom field) → jadwalkan 2026-10-15 08:00 WIB (zona situs = UTC, jadi 01:00).

Pakai --apply untuk benar-benar mengerjakan.
"""
import base64, importlib.util, json, os, re, sys, time, urllib.error, urllib.request
import xmlrpc.client

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

JUDUL = "Jerawat Hormonal pada Perempuan Dewasa: Penyebab dan Perawatan"
SLUG = "jerawat-hormonal-perempuan-dewasa"
FOKUS = "jerawat hormonal"
META_JUDUL = "Jerawat Hormonal pada Perempuan Dewasa: Penyebab & Perawatan"
META_DESC = ("Jerawat hormonal pada perempuan dewasa sering muncul berulang di dagu dan rahang. "
             "Kenali penyebab, ciri khas, dan pilihan perawatannya di sini.")
TANGGAL = "2026-10-15T01:00:00"   # 08:00 WIB (zona situs UTC)
GAMBAR = f"{WS}/tsc_feat_jerawat-hormonal-perempuan-dewasa.webp"
ALT_GAMBAR = JUDUL

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>Jerawat yang muncul lagi di dagu dan rahang menjelang haid sering membingungkan perempuan berusia 25 sampai
40 tahun. Kulit sudah dirawat, produk sudah dipilih hati-hati, tetapi benjolan merah yang nyeri itu tetap datang
di waktu yang sama setiap bulan. Keluhan seperti ini umumnya bukan soal kebersihan wajah, melainkan perubahan
hormon yang sedang bekerja di dalam tubuh.</p>

<p>Bagian berikut menjelaskan kenapa jerawat hormonal muncul di usia dewasa, apa yang membedakannya dari jerawat
remaja, dan perawatan seperti apa yang biasanya ditempuh. Tujuannya supaya Anda datang ke pemeriksaan dengan
gambaran yang jelas, bukan menebak-nebak sendiri.</p>

<h2>Kenapa Jerawat Hormonal Muncul di Usia Dewasa</h2>
<p>Kelenjar minyak di wajah bekerja mengikuti sinyal hormon. Ketika kadar androgen naik, atau ketika kulit menjadi
lebih peka terhadap androgen, produksi minyak meningkat dan saluran kelenjar menyempit. Minyak yang tertahan
bercampur sel kulit mati, lalu memicu peradangan. Hasilnya benjolan keras yang nyeri di bawah permukaan kulit.</p>

<p>Pada perempuan dewasa, pemicunya bisa berbeda-beda:</p>
<ul>
<li>Perubahan hormon menjelang haid, saat estrogen turun dan androgen relatif lebih dominan.</li>
<li>Sindrom ovarium polikistik, yang sering disertai siklus tidak teratur atau rambut halus berlebih di wajah.</li>
<li>Penghentian pil kontrasepsi, karena kulit kehilangan efek penekan minyak yang sebelumnya didapat dari pil itu.</li>
<li>Stres berkepanjangan, kurang tidur, dan pola makan tinggi gula, yang memengaruhi sensitivitas insulin dan ikut
memperberat keluhan.</li>
<li>Riwayat jerawat pada keluarga, yang membuat kulit lebih mudah bereaksi terhadap hormon.</li>
</ul>

<p>Sebagian perempuan baru mengenal jerawat justru setelah melewati usia remaja. Kulit yang dulu tenang bisa mulai
bereaksi ketika pola siklus berubah, setelah melahirkan, atau saat alat kontrasepsi dihentikan. Kehadiran jerawat
di usia 30-an karena itu bukan tanda kulit tidak terawat, melainkan petunjuk bahwa hormon sedang berubah.</p>

<h2>Ciri yang Membedakannya dari Jerawat Remaja</h2>
<p>Jerawat hormonal punya pola yang cukup khas, meski tetap perlu diperiksa dokter untuk memastikan penyebabnya.</p>
<ul>
<li>Muncul di bagian bawah wajah, terutama dagu, rahang, dan kadang leher.</li>
<li>Datang berulang pada waktu yang sama dalam siklus haid.</li>
<li>Berupa benjolan dalam yang nyeri, dengan sedikit komedo atau tidak ada sama sekali.</li>
<li>Membaik sebagian setelah haid, lalu kembali muncul pada siklus berikutnya.</li>
<li>Kadang meninggalkan bekas kehitaman atau cekung setelah benjolannya mengempis.</li>
</ul>
<p>Jerawat remaja umumnya muncul di dahi dan pipi dengan komedo yang jelas. Jerawat hormonal cenderung bertahan
lebih lama dan tidak cukup ditangani dengan produk pembersih saja.</p>

<h2>Yang Perlu Disiapkan Sebelum Memilih Perawatan</h2>
<p>Perawatan jerawat hormonal tidak bisa diseragamkan, karena penyebabnya perlu dipastikan lebih dulu. Beberapa hal
berikut biasanya ditanyakan saat konsultasi.</p>
<ul>
<li>Pola siklus haid, termasuk keteraturannya dan apakah keluhan kulit memburuk di waktu tertentu.</li>
<li>Obat yang sedang atau pernah dipakai, termasuk pil kontrasepsi dan suplemen.</li>
<li>Produk perawatan yang sedang dipakai, lengkap dengan frekuensinya.</li>
<li>Riwayat jerawat pada keluarga, serta keluhan lain seperti rambut rontok atau berat badan yang naik.</li>
</ul>
<p>Kalau ada kecurigaan ke arah sindrom ovarium polikistik atau gangguan hormon lain, dokter biasanya menyarankan
pemeriksaan penunjang seperti tes darah sebelum menentukan perawatan. Langkah ini membuat perawatan menyasar
penyebabnya, bukan hanya menutupi gejalanya.</p>

<h2>Pilihan Penanganan yang Biasanya Ditawarkan Dokter</h2>
<p>Penanganan jerawat hormonal berjalan bertahap dan hasilnya baru terlihat setelah beberapa bulan. Dokter Anda
akan memilih kombinasi yang sesuai kondisi kulit, riwayat kesehatan, dan rencana kehamilan.</p>
<ul>
<li>Obat oles berupa retinoid, asam azelaic, atau benzoil peroksida, untuk membantu melancarkan saluran kelenjar
dan meredakan peradangan.</li>
<li>Obat minum, misalnya antibiotik untuk jangka waktu terbatas, atau jenis lain yang bekerja pada hormon dan
diberikan hanya atas penilaian dokter.</li>
<li>Tindakan di klinik, seperti ekstraksi untuk benjolan yang tertahan, peeling medis, atau laser untuk meredakan
peradangan dan membantu memudarkan bekasnya.</li>
</ul>
<p>Karena keluhan ini berkaitan dengan hormon, perbaikan mengikuti siklus dan jarang terjadi dalam hitungan hari.
Dokter akan menentukan target waktu dan jadwal kontrol supaya hasilnya bisa dievaluasi, termasuk bila perlu
mengganti kombinasi obatnya.</p>

<h2>Perawatan Harian yang Menunjang</h2>
<p>Perawatan di rumah membantu kulit lebih tenang dan menekan risiko munculnya bekas. Kebiasaan berikut paling
berpengaruh.</p>
<ul>
<li>Bersihkan wajah dua kali sehari dengan pembersih lembut, tanpa menggosok.</li>
<li>Pakai pelembap yang sesuai jenis kulit, karena kulit berjerawat juga bisa kekurangan kelembapan.</li>
<li>Pakai pelindung matahari setiap hari, terutama saat memakai retinoid atau menjalani peeling.</li>
<li>Jangan memencet benjolan, karena memperbesar risiko peradangan dan bekas cekung.</li>
<li>Jangan menumpuk banyak produk baru sekaligus, sebab kulit jadi sulit dinilai perkembangannya.</li>
</ul>
<p>Satu hal yang sering dilewatkan adalah memberi jeda saat menilai hasil. Beri waktu minimal empat pekan sebelum
menyimpulkan sebuah produk tidak cocok, dan catat perubahan kulitnya supaya evaluasi di klinik lebih mudah.</p>

<p>Sebaiknya juga berhati-hati dengan produk yang menjanjikan hasil dalam waktu singkat. Perbaikan jerawat
hormonal umumnya baru terlihat setelah empat sampai delapan pekan perawatan yang konsisten.</p>

<h2>Kapan Sebaiknya ke Dokter Kulit</h2>
<p>Jerawat hormonal tidak selalu perlu perawatan medis. Ada beberapa keadaan yang sebaiknya tidak ditunda.</p>
<ul>
<li>Benjolan nyeri yang muncul berulang dan mulai meninggalkan bekas.</li>
<li>Jerawat yang tidak membaik setelah dua sampai tiga bulan perawatan mandiri.</li>
<li>Kecurigaan gangguan hormon, misalnya siklus haid tidak teratur atau rambut halus tumbuh di wajah.</li>
<li>Jerawat yang menurunkan kepercayaan diri sampai mengganggu aktivitas sehari-hari.</li>
</ul>
<p>Kalau jerawatnya hanya muncul sesekali tanpa nyeri, perawatan mandiri masih masuk akal untuk dijalankan lebih
dulu sambil diamati perkembangannya.</p>
<p>Pemeriksaan awal biasanya mencakup tanya jawab riwayat, pemeriksaan kulit, dan penjelasan kemungkinan
penyebabnya. Dari situ dokter menyusun rencana perawatan beserta perkiraan waktu yang dibutuhkan.</p>

<h2>Pertanyaan yang Sering Diajukan</h2>

<h3>Apakah jerawat hormonal bisa hilang sendiri?</h3>
<p>Sebagian keluhan membaik ketika hormon kembali seimbang, misalnya beberapa waktu setelah persalinan. Sebagian
lagi bertahan dan perlu bantuan perawatan medis, terutama kalau sudah berulang dan meninggalkan bekas.</p>

<h3>Apakah harus berhenti memakai kosmetik sama sekali?</h3>
<p>Tidak perlu. Yang lebih penting adalah memilih produk yang tidak menyumbat pori dan membersihkannya dengan
benar setiap malam. Kalau ragu, bawakan produknya saat konsultasi.</p>

<h3>Berapa lama sampai terlihat perubahan?</h3>
<p>Keluhan seperti ini umumnya mulai membaik dalam empat sampai delapan pekan perawatan yang rutin. Bekas yang
sudah terbentuk perlu waktu lebih lama dan ditangani terpisah.</p>

<h3>Apakah perawatannya aman saat merencanakan kehamilan?</h3>
<p>Beberapa jenis obat perlu dihindari pada masa kehamilan atau saat sedang merencanakan kehamilan. Karena itu
sampaikan rencana Anda sejak konsultasi pertama supaya pilihan perawatannya disesuaikan.</p>

<h3>Apakah facial di klinik bisa menggantikan pengobatan?</h3>
<p>Facial membantu membersihkan dan menenangkan kulit, tetapi tidak mengubah pemicu hormonalnya. Tindakan ini
biasanya dipakai sebagai penunjang, bukan satu-satunya penanganan.</p>

<h2>Baca juga</h2>
<p>Penjelasan soal keluhan kulit yang perlu diperiksa ada di
<a href="https://www.theskincodeclinic.com/kapan-harus-ke-dokter-kulit/">tanda kulit yang wajib diperiksa dokter</a>.
Gambaran perawatan jerawat oleh dokter spesialis ada di
<a href="https://www.theskincodeclinic.com/perawatan-jerawat-di-krian-oleh-dokter-spesialis/">panduan perawatan jerawat di Krian</a>,
sedangkan penanganan bekas yang sudah terbentuk dibahas di
<a href="https://www.theskincodeclinic.com/perawatan-bekas-jerawat-krian/">perawatan bekas jerawat</a>.</p>

<p>Kalau jerawat Anda muncul berulang di bagian bawah wajah dan sudah bertahan lebih dari dua bulan, pemeriksaan
kulit akan membantu memastikan penyebabnya. Kirimkan keluhan utama dan perkiraan kapan mulai muncul lewat
WhatsApp, dan tim kami membantu mengatur jadwal konsultasi yang paling sesuai.</p>

""" + TOMBOL + "\n"


def rest(path, 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}{path}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:300]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


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 "--apply" not in sys.argv:
    print("\n(dry run — pakai --apply)")
    sys.exit(0)

# ---------- 1. buat draf ----------
st, d = rest("/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.line([W - panel // 2, H // 2 - 46, W - panel // 2, H // 2 + 46], fill=PUTIH, width=10)
    dr.line([W - panel // 2 - 46, H // 2, W - panel // 2 + 46, H // 2], fill=PUTIH, width=10)
    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("Jerawat Hormonal", f("Poppins-Bold.ttf", 60), maks):
        dr.text((PAD, y), b, font=f("Poppins-Bold.ttf", 60), fill=NAVY)
        y += 72
    for b in bungkus("pada Perempuan Dewasa", f("Poppins-Bold.ttf", 60), maks):
        dr.text((PAD, y), b, font=f("Poppins-Bold.ttf", 60), fill=NAVY)
        y += 72
    y += 4
    for b in bungkus("Penyebab, ciri khas, dan pilihan perawatannya", f("Poppins-Regular.ttf", 26), maks):
        dr.text((PAD, y), b, font=f("Poppins-Regular.ttf", 26), fill=ABU)
        y += 36
    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)
    h = {"Authorization": f"Basic {AUTH}", **UA, "Content-Type": "image/webp",
         "Content-Disposition": f'attachment; filename="{nama}"'}
    r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/media", data=data, headers=h, method="POST")
    with urllib.request.urlopen(r, timeout=300) as x:
        med = json.loads(x.read())
    print(f"    unggah media #{med['id']} → {med.get('source_url')}")
    stm, dm = rest(f"/wp-json/wp/v2/media/{med['id']}", "POST",
                   {"alt_text": ALT_GAMBAR, "title": f"Gambar unggulan: {JUDUL}"})
    stp, dp = rest(f"/wp-json/wp/v2/posts/{PID}", "POST", {"featured_media": med["id"]})
    time.sleep(2)
    _, cekp = rest(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}")
    # baca balik alt_text
    _, cekm = rest(f"/wp-json/wp/v2/media/{med['id']}?context=edit&_fields=alt_text")
    print(f"    alt_text tersimpan: {str(cekm)[:120]}")
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:
    proxy = xmlrpc.client.ServerProxy(f"https://www.{DOM}/xmlrpc.php", allow_none=True)
    p = proxy.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()]
    proxy.wp.editPost(0, USER, SANDI, PID, {"custom_fields": kirim})
    time.sleep(2)
    p2 = proxy.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 = rest(f"/wp-json/wp/v2/posts/{PID}", "POST", {"status": "future", "date": TANGGAL})
print(f"[4] jadwalkan: HTTP {sts}")
time.sleep(3)
_, akhir = rest(f"/wp-json/wp/v2/posts/{PID}?context=edit&_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 = rest(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: {'ada' if 'wa.me/6285117444417' in html else 'TIDAK ADA'} · "
          f"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 ''}")
