#!/usr/bin/env python3
"""TSC — artikel harian: «Perawatan Luka agar Tidak Meninggalkan Bekas».

Topik dari tsc_topik_bank.json (entri pertama yang belum dipakai, fokus «perawatan luka»).
Sudah disaring tsc_cek_topik.py: aman (skor tertinggi 0,22 ke #9251 perawatan bekas jerawat,
di bawah ambang 0,30). Sudut artikel: luka umum (gores, lecet, luka jahit), bukan bekas jerawat.

Alur: draf (REST) -> gambar unggulan (desain sendiri, 1000x567 webp) -> meta Yoast (XML-RPC,
kirim ulang seluruh custom field) -> jadwalkan 2026-10-23 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 = "Perawatan Luka agar Tidak Meninggalkan Bekas"
SLUG = "perawatan-luka-agar-tidak-meninggalkan-bekas"
FOKUS = "perawatan luka"
META_JUDUL = "Perawatan Luka agar Tidak Meninggalkan Bekas"
META_DESC = ("Luka bisa menutup dengan bekas tipis kalau dirawat sejak awal. Kenali cara merawat luka "
             "baru, kebiasaan yang memperjelas bekas, dan kapan perlu diperiksa.")
TANGGAL = "2026-10-23T01:00:00"   # 08:00 WIB (zona situs UTC)
GAMBAR = f"{WS}/tsc_feat_perawatan-luka-agar-tidak-meninggalkan-bekas.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>Luka di tangan atau kaki sudah kering, korengnya lepas sendiri, tetapi bekasnya tinggal sebagai garis
gelap atau bercak yang warnanya berbeda dari kulit sekitarnya. Ada juga luka yang sudah menutup namun
terasa menonjol, keras, dan gatal kalau tersentuh. Bagi banyak orang, bagian inilah yang paling mengganggu,
bukan lukanya.</p>

<p>Yang melegakan, sebagian besar luka bisa menutup dengan bekas yang tipis kalau ditangani sejak awal.
Warna akhir bekas luka jarang ditentukan oleh besarnya sobekan, lebih sering oleh cara luka itu dirawat
pada beberapa hari pertama. Di bawah ini kami jelaskan apa saja yang menentukan, apa yang bisa Anda
lakukan sendiri di rumah, dan kapan sebaiknya diperiksa.</p>

<h2>Apa yang Membuat Luka Meninggalkan Bekas</h2>
<p>Kulit punya dua lapisan yang berperan saat luka menutup. Lapisan luar, yaitu epidermis, bisa pulih
tanpa meninggalkan jejak berarti. Kalau kerusakan sampai ke lapisan dalam atau dermis, tubuh menutupnya
dengan jaringan parut, dan jaringan inilah yang terlihat sebagai bekas.</p>

<p>Beberapa hal lain ikut menentukan seberapa jelas bekasnya nanti.</p>
<ul>
<li>Kedalaman dan luas luka. Gores dangkal berbeda hasilnya dengan luka bakar atau luka yang perlu dijahit.</li>
<li>Riwayat infeksi. Luka yang kotor dan meradang lebih lama menutup, dan peradangan berkepanjangan
membentuk jaringan parut lebih banyak.</li>
<li>Tegangan pada kulit. Luka di dada, bahu, punggung, lutut, atau sekitar sendi sering membentuk parut
lebih tebal karena kulit di area itu terus tertarik saat bergerak.</li>
<li>Warna kulit dan riwayat keluarga. Kulit yang lebih gelap lebih sering meninggalkan bercak gelap
setelah peradangan. Kalau ada anggota keluarga dengan keloid, risikonya ikut naik.</li>
<li>Paparan matahari. Sinar matahari pada luka yang sedang menutup membuat bercaknya lebih gelap dan
bertahan lebih lama.</li>
</ul>

<p>Bentuk bekasnya juga tidak seragam. Yang paling sering muncul adalah bercak berwarna lebih gelap
atau lebih pucat dari kulit sekitar, dengan permukaan yang rata. Bentuk lain adalah parut yang
menonjol dan terasa keras, kadang disertai rasa gatal atau tertarik. Parut yang tumbuh melebihi batas
luka aslinya disebut keloid, dan jenis ini lebih sering muncul pada kulit yang gelap serta pada
beberapa keluarga tertentu.</p>

<h2>Cara Merawat Luka Baru Supaya Bekasnya Tipis</h2>
<p>Perawatan yang membantu sebenarnya tidak rumit. Yang penting luka tetap bersih, lembap, dan tidak
diganggu.</p>
<ul>
<li>Bersihkan dengan air bersih yang mengalir. Untuk luka kotor, sabun lembut boleh dipakai secukupnya.
Hindari menggosok atau merendam luka berlama-lama.</li>
<li>Jangan pakai alkohol, hidrogen peroksida, atau antiseptik keras secara terus-menerus. Bahan itu
membunuh kuman sekaligus mengganggu jaringan baru yang sedang tumbuh.</li>
<li>Jaga luka tetap lembap. Luka yang lembap menutup lebih cepat dibanding luka yang dibiarkan kering
sampai berkerak. Pakai kasa yang tidak lengket atau plester penutup luka, lalu ganti sesuai anjuran.</li>
<li>Tutup luka pada hari-hari pertama, terutama kalau posisinya mudah bergesekan dengan pakaian.</li>
<li>Jangan mengorek koreng. Koreng adalah penutup alami. Mengangkatnya sebelum waktunya membuka kembali
lapisan yang sudah mulai menutup.</li>
<li>Lindungi dari matahari. Setelah luka menutup, tutup area itu atau pakai tabir surya setiap hari.</li>
<li>Cukupi asupan protein, vitamin C, dan zinc dari makanan sehari-hari. Kekurangan gizi memperlambat
penutupan luka.</li>
</ul>
<p>Kalau luka Anda dijahit, perhatikan jadwal kontrol untuk membuka jahitan. Benang yang dibiarkan
terlalu lama bisa meninggalkan jejak titik-titik kecil di kulit, terutama pada luka di wajah.
Sementara itu, balutan sebaiknya diganti sesuai anjuran dan tetap dijaga kering saat terkena air.</p>

<h2>Kebiasaan yang Justru Memperjelas Bekas</h2>
<p>Ada beberapa cara lama yang masih beredar di masyarakat dan sebaiknya ditinggalkan.</p>
<ul>
<li>Membiarkan luka terbuka supaya cepat kering. Luka yang kering berkerak menutup lebih lambat dan
bekasnya cenderung lebih tebal.</li>
<li>Mengoles odol, kopi, atau bubuk apa pun ke luka. Bahan itu tidak steril dan bisa memicu iritasi.</li>
<li>Memakai kapas berbentuk gumpalan untuk membersihkan luka, karena seratnya mudah tertinggal.</li>
<li>Menekan-nekan luka untuk mengeluarkan cairan. Yang keluar justru bisa menambah peradangan.</li>
<li>Mengelupas koreng karena tidak sabar, atau mandi air panas terlalu sering di area luka.</li>
</ul>

<h2>Kapan Luka Perlu Diperiksa ke Dokter</h2>
<p>Sebagian luka cukup dirawat di rumah. Namun ada keadaan yang sebaiknya tidak ditunggu.</p>
<ul>
<li>Luka dalam, luka tusuk, atau luka gigitan hewan.</li>
<li>Luka yang tepinya terbuka lebar sehingga perlu dirapatkan, terutama di wajah.</li>
<li>Luka yang belum menutup setelah tiga pekan.</li>
<li>Muncul nanah, bau tidak sedap, rasa panas, garis merah yang menjalar, atau demam.</li>
<li>Luka pada penderita diabetes atau gangguan pembuluh darah, sekecil apa pun lukanya.</li>
<li>Bekas luka yang menonjol, mengeras, melebar, atau terasa gatal dan nyeri berkepanjangan.</li>
</ul>
<p>Pemeriksaan awal biasanya singkat. Dokter melihat kondisi lukanya, menanyakan sejak kapan dan
bagaimana perawatannya, lalu menjelaskan kemungkinan yang terjadi. Kalau perlu ada tindakan, itu dibahas
setelah kondisinya jelas.</p>

<h2>Pilihan Penanganan Bekas Luka di Klinik</h2>
<p>Bekas luka yang sudah terbentuk tidak selalu harus diterima apa adanya. Beberapa pilihan yang biasa
digunakan dokter kulit antara lain:</p>
<ul>
<li>Silikon dalam bentuk gel atau lembaran, dipakai rutin dalam jangka waktu tertentu.</li>
<li>Microneedling, untuk membantu meratakan tekstur kulit dan memudarkan bercak.</li>
<li>Tindakan laser, dengan jenis dan kekuatan yang disesuaikan warna serta jenis bekasnya.</li>
<li>Injeksi ke dalam jaringan parut untuk parut yang menonjol dan keras.</li>
<li>Tindakan bedah kecil pada parut tertentu yang mengganggu fungsi atau penampilan.</li>
</ul>
<p>Perlu dipahami, hasil tiap orang berbeda. Ada yang membaik setelah beberapa kali tindakan, ada yang
butuh waktu lebih panjang. Karena itu rencana perawatan disusun setelah kulit diperiksa, dan bukan
dipilih dari daftar tindakan tanpa alasan.</p>

<p>Satu hal lagi soal waktu. Tindakan pada bekas luka umumnya baru dimulai ketika lukanya sudah
menutup sempurna dan peradangannya mereda. Mengerjakan tindakan sementara luka masih terbuka bisa
memperburuk keadaannya, karena kulit yang sedang menutup justru perlu ketenangan.</p>

""" + TOMBOL + """

<h2>Pertanyaan yang Sering Diajukan</h2>

<h3>Apakah luka yang dijahit pasti meninggalkan bekas?</h3>
<p>Hampir selalu ada jejak, tetapi bentuknya bisa tipis dan memudar seiring waktu. Kerapian penjahitan,
perawatan setelahnya, dan perlindungan dari matahari ikut menentukan hasil akhirnya.</p>

<h3>Apakah bekas luka bisa hilang sepenuhnya?</h3>
<p>Jaringan parut tidak bisa kembali seperti kulit yang belum pernah terluka. Yang bisa dicapai adalah
bekasnya memudar, teksturnya lebih rata, dan warnanya mendekati kulit sekitarnya.</p>

<h3>Apakah krim tertentu bisa mencegah bekas luka?</h3>
<p>Krim tidak menjamin bebas bekas, dan pemakaian bahan yang tidak cocok bisa memicu iritasi baru.
Krim yang mengandung silikon atau pelembap memang dipakai untuk membantu, tetapi hasilnya berbeda
pada setiap orang.</p>

<h3>Berapa lama bekas luka memudar?</h3>
<p>Warna bekas luka biasanya paling jelas pada dua sampai tiga bulan pertama, lalu memudar bertahap.
Masa ini bisa memakan waktu berbulan-bulan sampai lebih dari satu tahun, tergantung jenis dan lokasi
lukanya.</p>

<h2>Baca juga</h2>
<p>Kalau bekas yang mengganggu Anda muncul dari jerawat, penjelasannya ada di
<a href="https://www.theskincodeclinic.com/bekas-jerawat-cekung/">bekas jerawat cekung dan cara menanganinya</a>.
Panduan menjaga kelembapan kulit yang ikut berperan saat luka menutup kami ulas di
<a href="https://www.theskincodeclinic.com/menjaga-skin-barrier-kulit-sehat/">panduan menjaga skin barrier kulit</a>.
Untuk tanda yang perlu diperiksa lebih cepat, lihat
<a href="https://www.theskincodeclinic.com/kapan-harus-ke-dokter-kulit/">kapan sebaiknya ke dokter kulit</a>,
sedangkan daftar keluhan yang tidak sebaiknya ditunda ada di
<a href="https://www.theskincodeclinic.com/7-tanda-anda-butuh-konsultasi-ke-dokter-kulit-segera/">tanda Anda butuh konsultasi ke dokter kulit</a>.</p>

<p>Kalau luka Anda sudah menutup tetapi bekasnya membuat Anda kurang nyaman, atau ada luka baru yang
Anda ragu cara merawatnya, itu alasan yang cukup untuk berkonsultasi. Pemeriksaan akan menunjukkan
kondisi kulit Anda dan langkah yang masuk akal, 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.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("Perawatan Luka", 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("Agar tidak meninggalkan bekas", 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 ''}")
