#!/usr/bin/env python3
"""TSC — artikel: «Klinik Hapus Tato di Sidoarjo: Cara Kerja Laser dan Perkiraan Sesi».

Kata kunci utama: klinik hapus tato sidoarjo (+ hapus tato krian, laser hapus tato sidoarjo).
Layanan dikonfirmasi Bos 12 Okt 2026 ("TSC terima hapus tato").

Alur: draf (REST) → gambar unggulan (desain sendiri, 1000x567 webp) → meta Yoast (XML-RPC) →
jadwalkan 2026-10-18 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 = "Klinik Hapus Tato di Sidoarjo: Cara Kerja Laser dan Perkiraan Sesi"
SLUG = "klinik-hapus-tato-sidoarjo"
FOKUS = "klinik hapus tato sidoarjo"
META_JUDUL = "Klinik Hapus Tato Sidoarjo: Laser dan Perkiraan Sesi"
META_DESC = ("Klinik hapus tato di Sidoarjo dengan tindakan laser oleh dokter spesialis. Kenali cara "
             "kerjanya, warna tinta tersulit, dan alasan butuh beberapa sesi.")
TANGGAL = "2026-10-18T01:00:00"   # 08:00 WIB
GAMBAR = f"{WS}/tsc_feat_klinik-hapus-tato-sidoarjo.webp"
ALT_GAMBAR = JUDUL

WA = ("https://wa.me/6285117444417?text=Saya%20ingin%20konsultasi%20tindakan%20hapus%20tato%20di%20"
      "The%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>Ada beberapa alasan orang ingin menghapus tato. Sebagian karena tuntutan pekerjaan, sebagian karena
 nilai agama, sebagian lagi karena gambar yang dulu dibuat sudah tidak lagi terasa cocok. Apa pun alasannya,
 pertanyaan yang paling sering muncul sama: berapa kali tindakan yang dibutuhkan, dan apakah bisa hilang
 sepenuhnya.</p>

<p>Tato tidak bisa dihilangkan dengan krim, scrub, atau salep yang dijual bebas. Tinta tato disuntikkan
 ke lapisan dalam kulit, jauh di bawah permukaan yang bisa dijangkau produk perawatan. Karena itu
 penghapusannya memerlukan tindakan medis, dan alat utamanya adalah laser yang dioperasikan dokter.</p>

<h2>Kenapa Tato Sulit Hilang Sendiri</h2>
<p>Saat tato dibuat, jarum membawa tinta ke lapisan dermis, yaitu lapisan kulit yang letaknya di bawah
 lapisan luar. Butiran tinta di sana terlalu besar untuk dibawa keluar oleh sistem kekebalan tubuh.
 Sel-sel pembersih memang mendekat dan menelan sebagian kecil tinta, tetapi tidak mampu mengangkut
 seluruhnya. Itu sebabnya tato tetap terlihat bertahun-tahun, meski warnanya bisa memudar sedikit
 seiring waktu.</p>

<p>Karena tintanya tersimpan jauh dari permukaan, menggosok kulit atau memakai produk pengelupas hanya
 mengganggu lapisan luar. Lapisan luar memang berganti terus, tapi tintanya tidak ikut terangkat.</p>

<h2>Cara Kerja Laser Hapus Tato</h2>
<p>Laser bekerja dengan prinsip menyerap dan memecah. Berkas cahaya dengan panjang gelombang tertentu
 diarahkan ke area tato, lalu pigmen tinta menyerap energi itu dan pecah menjadi butiran yang jauh
 lebih kecil. Butiran inilah yang akhirnya cukup kecil untuk diangkut keluar oleh sistem kekebalan
 tubuh secara bertahap.</p>

<p>Karena proses pengangkutan itu butuh waktu, hasilnya tidak pernah terlihat dalam satu kali tindakan.
 Kulit perlu diberi jeda beberapa pekan sebelum sesi berikutnya, umumnya sekitar enam sampai delapan
 pekan. Jeda ini bukan sekadar waktu pemulihan kulit, tetapi juga waktu bagi tubuh untuk membersihkan
 sisa tinta yang sudah pecah.</p>

<p>Ada dua jenis laser yang banyak dipakai saat ini, yaitu laser pulsa nano dan laser pikodetik. Laser
 pikodetik memecah tinta dalam waktu yang lebih singkat sehingga panas yang tersisa di kulit lebih
 sedikit. Untuk tato dengan beberapa warna, dokter sering memakai lebih dari satu panjang gelombang
 dalam satu sesi.</p>

<h2>Warna Tinta Menentukan Tingkat Kesulitan</h2>
<p>Tidak semua warna sama mudahnya diangkat. Yang paling mudah adalah tinta hitam, disusul biru tua dan
 hijau tua tergantung kedalaman tintanya. Hitam sudah menjadi patokan karena hampir semua laser
 penghilang tato dirancang untuk menyerapnya.</p>

<ul>
 <li>Hitam dan biru tua: paling sering merespons dengan baik.</li>
 <li>Merah dan oranye: bisa diangkat, tetapi memerlukan panjang gelombang yang berbeda dari tinta hitam.</li>
 <li>Hijau dan biru muda: sering menjadi yang paling membandel karena hanya terserap oleh gelombang
 tertentu.</li>
 <li>Kuning dan putih: paling sulit. Tinta kuning sulit menyerap cahaya, dan tinta putih pada beberapa
 kasus justru berubah warna setelah terkena laser.</li>
</ul>

<p>Selain warna, jenis tato juga berpengaruh. Tato buatan sendiri di rumah biasanya lebih dangkal dan
 lebih cepat pudar dibanding tato profesional yang tintanya disuntikkan lebih dalam dan lebih padat.</p>

<h2>Berapa Sesi yang Biasanya Dibutuhkan</h2>
<p>Untuk tato profesional berukuran sedang dengan satu warna dominan, jumlah sesi yang umum adalah lima
 sampai sepuluh, dengan jeda enam sampai delapan pekan. Tato berwarna banyak, berukuran besar, atau
 sudah ditimpa tato baru bisa memerlukan sesi yang lebih banyak lagi.</p>

<p>Perlu dipahami sejak awal bahwa hasil akhirnya berbeda-beda pada setiap orang. Sebagian tato terangkat
 hampir bersih, sebagian menyisakan bayangan samar, dan sebagian lagi berhenti pada warna yang jauh
 lebih muda. Faktor yang menentukan antara lain kedalaman tinta, jumlah warna, usia tato, lokasi tubuh,
 dan jenis kulit Anda. Karena itu, perkiraan jumlah sesi sebaiknya dibicarakan setelah dokter melihat
 langsung tato yang bersangkutan, bukan dari foto atau perkiraan sendiri.</p>

""" + TOMBOL + """

<h2>Efek Samping yang Perlu Diketahui</h2>
<p>Setelah tindakan, area yang ditembak laser biasanya melepuh, mengeras, atau membentuk kerak seperti
 luka bakar ringan. Ini bagian yang wajar dari proses penyembuhan dan akan membaik dalam satu sampai
 dua pekan.</p>

<p>Yang perlu diwaspadai adalah bekas yang menetap. Pada sebagian orang dapat muncul perubahan warna
 kulit: area yang ditindak menjadi lebih terang atau justru lebih gelap dibanding kulit sekitarnya.
 Risiko ini lebih besar pada kulit yang berwarna lebih gelap dan pada tato yang ditangani dengan energi
 terlalu tinggi. Bekas luka permanen juga bisa terjadi, terutama bila kerak dikelupas paksa.</p>

<h2>Siapa yang Sebaiknya Berhati-hati</h2>
<p>Ada beberapa keadaan yang membuat tindakan laser perlu ditunda atau dipertimbangkan ulang:</p>
<ul>
 <li>Memiliki riwayat keloid atau bekas luka yang menonjol.</li>
 <li>Sedang hamil atau menyusui.</li>
 <li>Ada infeksi, luka terbuka, atau peradangan aktif di area tato.</li>
 <li>Sedang memakai obat yang membuat kulit sensitif terhadap cahaya.</li>
 <li>Memiliki penyakit kulit tertentu di area yang sama, seperti psoriasis atau vitiligo.</li>
 <li>Sedang menjalani pengobatan jerawat yang membuat kulit lebih rentan.</li>
</ul>
<p>Keadaan-keadaan ini tidak selalu berarti tindakan tidak boleh dilakukan. Yang penting, dokter perlu
 mengetahuinya lebih dulu supaya penilaian manfaat dan risikonya masuk akal.</p>

<h2>Perawatan Setelah Tindakan</h2>
<p>Cara Anda merawat area setelah tindakan sama pentingnya dengan tindakannya sendiri.</p>
<ul>
 <li>Jaga area tetap bersih dan kering sesuai petunjuk dokter.</li>
 <li>Jangan mengelupas atau menggaruk kerak yang terbentuk.</li>
 <li>Hindari berenang, berendam, atau sauna selama masa penyembuhan.</li>
 <li>Lindungi dari matahari, dan pakai tabir surya setelah luka menutup.</li>
 <li>Hentikan dulu aktivitas yang menggesek area tersebut, termasuk pakaian yang ketat.</li>
</ul>
<p>Kalau muncul tanda infeksi seperti nanah, bau, atau nyeri yang makin berat, segera hubungi klinik.</p>

<h2>Kenapa Sebaiknya Ditangani Dokter</h2>
<p>Laser penghilang tato bukan alat yang bisa dipakai tanpa penilaian medis. Parameter yang dipakai,
 seperti panjang gelombang dan besarnya energi, ditentukan oleh warna tinta, kedalaman, dan jenis kulit.
 Energi yang terlalu rendah membuat sesi terbuang, sedangkan yang terlalu tinggi menambah risiko bekas
 luka dan perubahan warna permanen.</p>

<p>Di The Skin Code Clinic Krian Sidoarjo, tindakan hapus tato dilakukan oleh dokter spesialis kulit
 dan kelamin setelah pemeriksaan awal. Pemeriksaan itu mencakup warna dan usia tato, kondisi kulit
 di sekitarnya, riwayat bekas luka, serta rencana jumlah sesi. Kalau Anda juga mempertimbangkan
 tindakan lain seperti <a href="https://www.theskincodeclinic.com/hapus-tahi-lalat-aman-estetis-kulit-lebih-percaya-diri/">hapus tahi lalat</a>,
 biasanya bisa dibicarakan dalam kunjungan yang sama.</p>

<h2>Pertanyaan yang Sering Diajukan</h2>

<h3>Apakah tato bisa hilang seratus persen?</h3>
<p>Tidak selalu. Kebanyakan tato terangkat sebagian besar, tetapi bisa menyisakan bayangan samar
 tergantung warna, kedalaman tinta, dan jenis kulit. Yang bisa diusahakan adalah mengurangi tintanya
 sejauh mungkin dengan risiko bekas yang sekecil mungkin.</p>

<h3>Apakah tindakannya sakit?</h3>
<p>Rasanya sering digambarkan seperti karet gelang yang dilepaskan ke kulit berulang kali. Sebagian
 klinik memakai krim bius sebelum tindakan untuk mengurangi rasa tidak nyaman.</p>

<h3>Berapa lama jeda antar sesi?</h3>
<p>Umumnya enam sampai delapan pekan. Jeda ini memberi waktu kulit pulih sekaligus memberi kesempatan
 tubuh membersihkan tinta yang sudah pecah.</p>

<h3>Bolehkah langsung menimpa dengan tato baru?</h3>
<p>Bisa, dan dalam beberapa kasus memang itu tujuannya. Tato lama perlu dipudarkan dulu supaya gambar
 barunya tidak menumpuk menjadi gelap. Waktunya ditentukan setelah dokter menilai hasil sesi terakhir.</p>

<h3>Apakah bisa dipastikan hanya dengan melihat foto?</h3>
<p>Tidak. Foto bisa membantu memberi gambaran awal, tetapi perkiraan jumlah sesi dan biaya sebaiknya
 ditentukan setelah pemeriksaan langsung, karena warna, kedalaman, dan kondisi kulit baru terlihat jelas
 saat diperiksa.</p>

<h2>Baca juga</h2>
<p>Kalau tato Anda berada di area tubuh yang perlu perawatan kulit tambahan, penjelasan tentang tindakan
 lain bisa dibaca di <a href="https://www.theskincodeclinic.com/prp-wajah-di-krian-solusi-bekas-jerawat-dan-bopeng-yang-susah-hilang/">PRP untuk bekas jerawat dan bopeng</a>.
 Untuk gambaran layanan klinik secara keseluruhan, termasuk jadwal praktik dan lokasi, ada di
 <a href="https://www.theskincodeclinic.com/">klinik kulit dan kelamin Krian Sidoarjo</a>.</p>

<p>Menghapus tato adalah proses bertahap, bukan sekali jadi. Karena itu, langkah pertama yang paling
 masuk akal adalah pemeriksaan: dokter melihat tato Anda, menjelaskan kemungkinan hasilnya, lalu
 menyusun rencana sesi yang masuk akal. Dari situ Anda bisa memutuskan dengan gambaran yang jelas,
 bukan berdasarkan janji yang tidak bisa dipastikan.</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 · meta desc: {len(META_DESC)} char")
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"   H2: {ISI.count('<h2')} · H3: {ISI.count('<h3')}")
print(f"   jadwal: {TANGGAL} (08:00 WIB)")

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

# ---------- 1. 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')}")

# ---------- 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.ellipse([W - panel // 2 - 30, H // 2 - 30, W - panel // 2 + 30, H // 2 + 30], 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("Hapus Tato", 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("Tindakan laser oleh dokter spesialis kulit", 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')}")
    rest(f"/wp-json/wp/v2/media/{med['id']}", "POST", {"alt_text": ALT_GAMBAR,
                                                       "title": f"Gambar unggulan: {JUDUL}"})
    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}")
except Exception as e:
    print(f"[2] gambar unggulan GAGAL: {str(e)[:200]}")

# ---------- 3. meta Yoast via XML-RPC ----------
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", [])
    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
    proxy.wp.editPost(0, USER, SANDI, PID, {"custom_fields": [{"key": k, "value": v} for k, v in baru.items()]})
    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"[3] meta: title={v.get('_yoast_wpseo_title')!r}")
    print(f"          desc={str(v.get('_yoast_wpseo_metadesc'))[:90]!r}")
    print(f"          focuskw={v.get('_yoast_wpseo_focuskw')!r}")
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,slug,link,featured_media")
if isinstance(akhir, dict):
    print(f"    status={akhir.get('status')} · date={akhir.get('date')} · {akhir.get('link')}")
    _, 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'}")
else:
    print("    baca balik gagal:", akhir)
