#!/usr/bin/env python3
"""TSC — artikel harian: «Bekas Jerawat Cekung: Kenapa Terbentuk dan Bagaimana Ditangani».

Topik dari tsc_topik_bank.json (entri #2, fokus «bekas jerawat cekung»). Sudah disaring
tsc_cek_topik.py: aman (skor tertinggi 0,29 ke #8843, di bawah ambang 0,30).
Alur: draf (REST) → gambar unggulan (desain sendiri, 1000x567 webp) → meta Yoast (XML-RPC,
kirim ulang seluruh custom field) → jadwalkan 2026-10-16 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 = "Bekas Jerawat Cekung: Kenapa Terbentuk dan Bagaimana Ditangani"
SLUG = "bekas-jerawat-cekung"
FOKUS = "bekas jerawat cekung"
META_JUDUL = "Bekas Jerawat Cekung: Penyebab dan Cara Menanganinya"
META_DESC = ("Bekas jerawat cekung terbentuk ketika peradangan merusak jaringan kulit di lapisan dalam. "
             "Kenali jenis, penyebab, dan pilihan tindakannya di sini.")
TANGGAL = "2026-10-16T01:00:00"   # 08:00 WIB (zona situs UTC)
GAMBAR = f"{WS}/tsc_feat_bekas-jerawat-cekung.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>Jerawatnya sudah kering dan tidak ada benjolan baru, tetapi wajah tetap terasa tidak rata. Begitu kena cahaya
dari samping, muncul bayangan kecil di pipi atau dahi yang membuat kulit seperti berlubang. Keluhan seperti ini
sering disebut bekas jerawat cekung, dan banyak orang baru menyadarinya setelah jerawatnya mereda.</p>

<p>Bekas cekung berbeda dari noda kehitaman atau kemerahan yang biasanya memudar sendiri. Cekungannya terbentuk
di lapisan kulit yang lebih dalam, jadi tidak cukup diatasi dengan krim pencerah. Bagian berikut menjelaskan
kenapa cekungan itu muncul, jenis-jenisnya, dan langkah yang masuk akal untuk memperbaikinya.</p>

<h2>Kenapa Bekas Jerawat Cekung Terbentuk</h2>
<p>Saat jerawat meradang cukup dalam, jaringan di bawah permukaan kulit ikut rusak. Tubuh berusaha memperbaiki
dengan membentuk kolagen baru, tetapi jumlahnya sering tidak sepadan dengan jaringan yang hilang. Kulit yang
menutup di atasnya kemudian tertarik ke dalam, dan di situlah cekungan mulai terlihat.</p>

<p>Peradangan yang panjang membuat risiko ini naik. Jerawat batu yang nyeri, jerawat yang berulang di tempat
yang sama, dan kebiasaan memencet benjolan adalah tiga hal yang paling sering memperberatnya. Menunda
penanganan juga berpengaruh, karena peradangan yang dibiarkan bekerja lebih lama merusak jaringan di area
yang sama berulang kali.</p>

<p>Satu hal yang perlu dipahami, cekungan tidak muncul saat jerawatnya sembuh. Cekungan sudah terbentuk selama
peradangan berlangsung, dan baru jelas terlihat setelah kulit di atasnya menutup rata.</p>

<p>Yang membuat bekas cekung terasa berbeda dari keluhan kulit lain adalah sifatnya yang menetap. Noda bisa
memudar mengikuti pergantian sel kulit, sedangkan cekungan terjadi karena jaringan penopang di bawahnya
berkurang. Karena itu penanganannya lebih sering memakai tindakan yang merangsang pembentukan jaringan baru,
bukan perawatan permukaan saja.</p>

<h2>Tiga Jenis Bekas Cekung dan Cirinya</h2>
<p>Dokter membedakan bekas cekung berdasarkan bentuk dan kedalamannya, karena pilihan tindakan mengikuti bentuk
tersebut. Tiga jenis yang paling sering ditemui sebagai berikut.</p>
<ul>
<li>Cekungan jarum. Sempit dan dalam, seperti tusukan jarum, paling sering muncul di pipi dan dahi.</li>
<li>Cekungan kotak. Tepinya tegas menyerupai kotak, bisa dangkal maupun cukup dalam.</li>
<li>Cekungan bergelombang. Permukaan kulit terlihat bergelombang karena jaringan di bawahnya tertarik, dan
lebih terasa saat wajah berekspresi.</li>
</ul>
<p>Satu wajah bisa punya lebih dari satu jenis sekaligus, dan sebarannya pun tidak selalu merata. Karena itu
pemeriksaan langsung diperlukan sebelum tindakan ditentukan, sebab cara menangani cekungan yang sempit
berbeda dengan yang bergelombang.</p>

<h2>Siapa yang Lebih Mudah Meninggalkan Bekas</h2>
<p>Tidak semua orang yang berjerawat meninggalkan bekas cekung, dan sebagian orang memang lebih rentan. Faktor
berikut biasanya ikut berperan.</p>
<ul>
<li>Jenis jerawatnya. Jerawat batu dan jerawat yang meradang dalam paling sering meninggalkan cekungan.</li>
<li>Riwayat keluarga. Kalau orang tua atau saudara punya bekas serupa, kulit Anda cenderung bereaksi dengan
pola yang sama.</li>
<li>Warna kulit. Kulit yang lebih gelap lebih mudah menampakkan bekas kehitaman setelah peradangan mereda.</li>
<li>Usia. Kulit yang lebih muda memperbaiki diri lebih cepat, tetapi juga lebih aktif membentuk kolagen
sehingga cekungannya kadang justru lebih terlihat.</li>
<li>Kebiasaan memencet dan merawat luka. Ini satu-satunya faktor yang benar-benar bisa Anda kendalikan.</li>
</ul>

<h2>Perawatan di Rumah: Yang Membantu dan yang Tidak</h2>
<p>Perawatan harian tidak bisa mengangkat cekungan yang sudah terbentuk. Yang masih bisa dilakukan adalah
menjaga kulit tetap sehat dan menekan risiko munculnya cekungan baru.</p>
<ul>
<li>Pakai pelindung matahari setiap hari. Bagian ini paling sering dilewatkan, padahal sangat menentukan
warna bekas yang tertinggal.</li>
<li>Pakai retinoid atau asam eksfoliasi ringan bila dianjurkan dokter, untuk membantu pergantian sel kulit.</li>
<li>Jaga kulit tetap lembap, karena kulit kering membuat tekstur tidak rata lebih tampak.</li>
<li>Hentikan kebiasaan memencet, menggosok, dan memakai scrub kasar di area bekas.</li>
<li>Tangani jerawat aktif lebih dulu supaya tidak menambah bekas baru di tempat yang sama.</li>
</ul>
<p>Krim yang menjanjikan cekungan hilang dalam hitungan hari sebaiknya tidak dipercaya. Bahan oles bekerja di
permukaan kulit, sedangkan cekungan berada di lapisan yang lebih dalam. Untuk kondisi seperti ini, krim
memang bukan jalannya.</p>

<h2>Pilihan Tindakan di Klinik</h2>
<p>Tindakan untuk bekas cekung dipilih setelah dokter melihat jenis, kedalaman, dan sebarannya. Beberapa
pilihan yang umum ditawarkan antara lain:</p>
<ul>
<li>Microneedling atau dermapen, yang membuat luka mikro terkendali untuk merangsang pembentukan kolagen baru.</li>
<li>Laser fraksional, yang bekerja pada lapisan kulit tertentu untuk memperbaiki tekstur.</li>
<li>Subsisi, yaitu tindakan melepas tarikan jaringan yang menyebabkan cekungan bergelombang.</li>
<li>Peeling medis, untuk membantu keseragaman warna dan permukaan kulit.</li>
<li>Bahan pengisi, untuk cekungan tertentu yang perlu diangkat sementara.</li>
<li>PRP, yang kadang dikombinasikan dengan tindakan lain untuk mendukung perbaikan jaringan.</li>
</ul>
<p>Kombinasi dan jumlah sesi berbeda untuk setiap orang, tergantung pada kondisi kulit dan bagaimana reaksinya
terhadap tindakan pertama. Hal yang sama berlaku pada jeda antar tindakan, yang biasanya diatur beberapa
pekan supaya kulit punya waktu pulih sebelum sesi berikutnya.</p>

<h2>Berapa Lama Perbaikannya Terlihat</h2>
<p>Perbaikan bekas cekung berjalan bertahap dan tidak bisa dinilai dari satu kali tindakan. Ada dua hal yang
perlu Anda pegang: hasilnya muncul perlahan, dan tujuan akhirnya biasanya memperbaiki tekstur kulit, bukan
mengembalikannya persis seperti sebelum jerawat muncul.</p>

<p>Kalau ada tempat yang menjanjikan cekungan hilang total hanya dalam sekali datang, itu patut dipertanyakan.
Yang bisa dijadikan pegangan adalah rencana perawatan dengan tahapan yang jelas, jadwal kontrol, dan evaluasi
berkala terhadap perkembangan tekstur kulit Anda.</p>

""" + TOMBOL + """

<h2>Pertanyaan yang Sering Diajukan</h2>

<h3>Apakah bekas cekung bisa hilang sendiri?</h3>
<p>Cekungan dangkal kadang membaik perlahan dalam beberapa bulan, terutama pada kulit yang masih muda. Cekungan
yang sudah dalam jarang menutup sendiri, dan biasanya perlu tindakan untuk memperbaiki teksturnya.</p>

<h3>Bolehkah menjalani tindakan saat jerawat masih aktif?</h3>
<p>Umumnya jerawat aktif ditangani lebih dulu. Tindakan pada kulit yang masih berjerawat berisiko memicu
peradangan baru dan menambah bekas. Setelah jerawatnya terkendali, barulah rencana perbaikan tekstur disusun.</p>

<h3>Berapa lama jeda antar tindakan?</h3>
<p>Jeda umumnya beberapa pekan, tergantung jenis tindakan dan reaksi kulit Anda. Dokter akan mengatur jadwalnya
supaya kulit sempat pulih sebelum sesi berikutnya dijalani.</p>

<h3>Apakah tindakannya menyakitkan?</h3>
<p>Sebagian tindakan memakai obat bius oles sebelum dikerjakan, sehingga rasa tidak nyaman bisa ditekan. Setelah
tindakan, kulit umumnya kemerahan atau terasa hangat selama beberapa hari, lalu berangsur normal.</p>

<h2>Baca juga</h2>
<p>Pilihan perawatan bekas jerawat di klinik kami rangkum pada
<a href="https://www.theskincodeclinic.com/perawatan-bekas-jerawat-krian/">perawatan bekas jerawat di Krian</a>,
sedangkan penjelasan salah satu tindakannya ada di
<a href="https://www.theskincodeclinic.com/microneedling-dermapen-bekas-jerawat-krian/">microneedling dermapen untuk bekas jerawat</a>.
Untuk jerawat yang masih aktif dan berulang, mulai dari
<a href="https://www.theskincodeclinic.com/perawatan-jerawat-di-krian-oleh-dokter-spesialis/">panduan perawatan jerawat oleh dokter spesialis</a>.
Kalau Anda belum yakin apakah keluhan kulit ini perlu diperiksa, lihat
<a href="https://www.theskincodeclinic.com/kapan-harus-ke-dokter-kulit/">tanda kulit yang sebaiknya diperiksa dokter</a>.</p>

<p>Kalau cekungan di wajah Anda membuat Anda menahan diri untuk berfoto atau bertemu orang, itu alasan yang
cukup untuk berkonsultasi. Pemeriksaan awal akan menunjukkan jenis bekasnya dan tindakan apa yang masuk akal
untuk kondisi kulit Anda, tanpa perlu menebak sendiri.</p>
"""


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 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("Bekas Jerawat", 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("Cekung", 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("Kenapa terbentuk dan bagaimana ditangani", 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}")
    _, 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 ''}")
