#!/usr/bin/env python3
"""Perbaikan harian tslaw.id 2026-10-03 — post 3208 (prioritas 1: tayangan ada, klik nol).

Fokus: selaraskan judul SEO + meta description dengan kueri nyata GSC
("pendaftaran merek", "pendaftaran merek dagang", "daftar merek dagang", "daftar merek")
+ tambah isi yang menjawab kueri itu. Sekalian: koreksi tarif PNBP DJKI, perbaiki href
tombol WA yang rusak, rapikan merek "TSLaw" -> "TS Law".
"""
import base64, json, re, sys, os, html as htmlmod
import urllib.request, urllib.error

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from cfg_tslaw import CFG

AUTH = base64.b64encode(f"{CFG['user']}:{CFG['pass']}".encode()).decode()
BASE = f"https://{CFG['domain']}/wp-json/wp/v2"
HDR = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}


def rest_get(path, timeout=90):
    req = urllib.request.Request(BASE + path, headers=HDR)
    with urllib.request.urlopen(req, timeout=timeout) as r:
        return json.load(r)


def rest_post(path, payload, timeout=180):
    data = json.dumps(payload).encode()
    req = urllib.request.Request(
        BASE + path,
        data=data,
        headers={**HDR, "Content-Type": "application/json"},  # WAJIB: tanpa ini WP diam-diam no-op
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=timeout) as r:
            return r.status, json.load(r)
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode()[:800]


PID = 3208
OUT = f"{WS}/tslaw_pemulihan/perbaikan_20261003"
os.makedirs(OUT, exist_ok=True)

p = rest_get(f"/posts/{PID}?context=edit")
raw = p["content"]["raw"]
old_title = p["title"]["raw"]
with open(f"{OUT}/post_{PID}_SEBELUM_FINAL.json", "w") as f:
    json.dump(p, f, ensure_ascii=False, indent=1)
with open(f"{OUT}/post_{PID}_SEBELUM_FINAL.html", "w") as f:
    f.write(raw)


def wc(html):
    t = htmlmod.unescape(re.sub(r"<script.*?</script>", " ", html, flags=re.S))
    t = re.sub(r"<[^>]+>", " ", t)
    return len(t.split())


KATA_SEBELUM = wc(raw)
print(f"[sebelum] kata={KATA_SEBELUM} judul={old_title!r}")
print(f"[sebelum] meta={p['meta'].get('_yoast_wpseo_metadesc')!r}")
print(f"[sebelum] seo_title={p['meta'].get('_yoast_wpseo_title')!r} fokus={p['meta'].get('_yoast_wpseo_focuskw')!r}")

new = raw

# ---------- 1. Blok ringkasan cepat (menjawab kueri generik "pendaftaran merek") ----------
anchor_h2_apa = '<h2 class="wp-block-heading">Apa Itu Merek Dagang dan Mengapa Penting</h2>'
assert raw.count(anchor_h2_apa) == 1, "anchor H2 'Apa Itu' tidak unik"
RINGKASAN = """<h2 class="wp-block-heading">Pendaftaran Merek Dagang: Ringkasan Cepat</h2>
<p>Kalau Anda butuh jawaban singkat sebelum membaca panduan di bawah, berikut inti pendaftaran merek di Indonesia.</p>
<ul>
<li><strong>Tempat pendaftaran:</strong> sistem resmi DJKI di <a href="https://merek.dgip.go.id" rel="nofollow noopener" target="_blank">merek.dgip.go.id</a> — tidak perlu datang ke kantor.</li>
<li><strong>Syarat utama:</strong> merek bersifat khas, tidak generik, dan belum didaftarkan pihak lain.</li>
<li><strong>Dokumen:</strong> KTP dan NPWP untuk perorangan; akta pendirian, SK badan hukum, NPWP, dan KTP direktur untuk badan usaha.</li>
<li><strong>Biaya resmi (PNBP):</strong> Rp500.000 per kelas untuk Usaha Mikro dan Usaha Kecil (UMK), Rp2.800.000 per kelas untuk pemohon umum.</li>
<li><strong>Lama proses:</strong> sekitar 12 bulan, dari pemeriksaan formalitas sampai sertifikat diterbitkan.</li>
<li><strong>Masa perlindungan:</strong> 10 tahun sejak tanggal penerimaan, bisa diperpanjang setiap 10 tahun.</li>
</ul>
<p>Tarif PNBP bisa berubah, jadi pastikan angkanya masih berlaku di laman resmi DJKI sebelum Anda membayar.</p>
"""
new = new.replace(anchor_h2_apa, RINGKASAN + anchor_h2_apa, 1)

# ---------- 2. Seksi baru: jenis merek (menjawab kueri "merek dagang") ----------
anchor_h2_syarat = '<h2 class="wp-block-heading">Syarat Daftar Merek Dagang</h2>'
assert raw.count(anchor_h2_syarat) == 1, "anchor H2 Syarat tidak unik"
JENIS = """<h2 class="wp-block-heading">Merek Dagang, Merek Jasa, dan Merek Kolektif: Apa Bedanya?</h2>
<p>Undang-Undang Merek membagi merek ke dalam beberapa jenis. Perbedaan ini menentukan jenis permohonan yang Anda ajukan dan kelas mana yang harus dipilih saat mendaftar.</p>
<ul>
<li><strong>Merek dagang</strong> dipakai untuk barang, misalnya produk makanan, pakaian, kosmetik, atau elektronik. Merek pada kemasan produk yang Anda jual masuk kategori ini.</li>
<li><strong>Merek jasa</strong> dipakai untuk layanan, seperti jasa konsultan, kafe, klinik, bengkel, atau jasa perbaikan. Nama kafe Anda lebih tepat didaftarkan sebagai merek jasa di kelas 43.</li>
<li><strong>Merek kolektif</strong> didaftarkan oleh kumpulan atau asosiasi untuk dipakai bersama anggotanya, misalnya merek bersama untuk produk koperasi atau asosiasi pengrajin.</li>
</ul>
<p>Salah menentukan jenis dan kelas merek membuat perlindungan Anda tidak sesuai kebutuhan bisnis. Jika usaha Anda menjual barang sekaligus menyediakan layanan, pertimbangkan mendaftar di lebih dari satu kelas sejak awal.</p>
"""
new = new.replace(anchor_h2_syarat, JENIS + anchor_h2_syarat, 1)

# ---------- 3. Koreksi tarif PNBP (biaya pokok) ----------
old_pokok = """<p>Biaya pendaftaran merek untuk UMKM melalui DJKI adalah sekitar 1,8 juta rupiah per kelas. Jika Anda mendaftarkan untuk lebih dari satu kelas, biaya dikalikan dengan jumlah kelas.</p>
<p>Biaya perpanjangan merek setiap 10 tahun adalah sekitar 2,5 juta rupiah. Pastikan Anda memperpanjang tepat waktu agar perlindungan hukum tidak putus.</p>"""
new_pokok = """<p>Biaya pendaftaran merek ditetapkan sebagai Penerimaan Negara Bukan Pajak (PNBP), sehingga tarifnya sama untuk semua pemohon di seluruh Indonesia dan tidak bisa dinegosiasikan.</p>
<p>Mengacu tarif resmi DJKI, permohonan pendaftaran merek dikenakan Rp500.000 per kelas bagi pelaku Usaha Mikro dan Usaha Kecil (UMK), dan Rp2.800.000 per kelas untuk pemohon umum. Jika Anda mendaftarkan merek di lebih dari satu kelas, biaya dikalikan jumlah kelas yang dipilih.</p>
<p>Perpanjangan perlindungan tiap 10 tahun juga berbeda: Rp1.000.000 per kelas untuk UMK dan Rp3.500.000 per kelas untuk umum bila diajukan dalam masa 6 bulan sebelum atau tepat saat perlindungan berakhir. Jika Anda terlambat dan mengajukannya dalam 6 bulan setelah masa berlaku habis, tarifnya naik menjadi Rp2.000.000 (UMK) dan Rp7.000.000 (umum) per kelas. Karena itu, jangan menunda perpanjangan.</p>"""
assert raw.count(old_pokok) == 1, "blok biaya pokok tidak ditemukan"
new = new.replace(old_pokok, new_pokok, 1)
new = new.replace('<h3 class="wp-block-heading">Biaya Pokok</h3>',
                  '<h3 class="wp-block-heading">Tarif Resmi PNBP</h3>', 1)

# ---------- 4. Koreksi paragraf pembayaran ----------
old_bayar = "Biaya pendaftaran merek untuk satu kelas adalah sekitar 1,8 juta rupiah untuk UMKM. Harga ini lebih murah dibandingkan pendaftaran jalur umum. Pastikan Anda mendaftar sebagai UMKM agar mendapatkan keringanan biaya."
new_bayar = "Untuk pelaku UMK, tarif PNBP pendaftaran merek adalah Rp500.000 per kelas — jauh lebih murah dibanding tarif umum Rp2.800.000 per kelas. Pastikan permohonan Anda diajukan dengan status UMK agar mendapat tarif tersebut."
assert raw.count(old_bayar) == 1, "paragraf pembayaran tidak ditemukan"
new = new.replace(old_bayar, new_bayar, 1)

# ---------- 5. Bangun ulang blok FAQ + koreksi jawaban biaya + 2 Q baru ----------
m = re.search(r'<div class="wp-block-rank-math-faq-block">.*?(?=<div class="wp-block-buttons)', raw, re.S)
assert m, "blok FAQ tidak ditemukan"
faq_old = m.group(0)
items = re.findall(
    r'<h3 class="rank-math-faq-question">(.*?)</h3>\s*<div class="rank-math-faq-answer">\s*<p>(.*?)</p>',
    faq_old, re.S)
assert len(items) == 5, f"jumlah FAQ awal {len(items)} != 5"
faq = [list(x) for x in items]
# koreksi jawaban biaya (item pertama)
assert "1,8 juta" in faq[0][1], "jawaban biaya FAQ tidak sesuai dugaan"
faq[0][1] = ("Biaya resmi pendaftaran merek di DJKI adalah Rp500.000 per kelas untuk Usaha Mikro dan Usaha Kecil, "
             "dan Rp2.800.000 per kelas untuk pemohon umum. Jika menggunakan jasa konsultan HKI, ada tambahan biaya jasa "
             "berkisar Rp2-5 juta di luar tarif PNBP tersebut.")
faq.append(["Berapa biaya pendaftaran merek untuk UMKM?",
            "Pelaku Usaha Mikro dan Usaha Kecil hanya membayar Rp500.000 per kelas untuk permohonan merek, "
            "sedangkan pemohon umum membayar Rp2.800.000 per kelas. Perbedaan status inilah alasan pentingnya "
            "mendaftar dengan kategori UMK bila usaha Anda memenuhi kriteria."])
faq.append(["Apa beda merek dagang dan merek jasa?",
            "Merek dagang melindungi nama atau logo produk barang, sedangkan merek jasa melindungi nama layanan. "
            "Keduanya didaftarkan ke DJKI, tetapi kelas barang atau jasa yang dipilih berbeda sesuai bidang usaha Anda."])

faq_html = '<div class="wp-block-rank-math-faq-block">\n' + '\n'.join(
    '<div class="rank-math-faq-item">\n'
    f'<h3 class="rank-math-faq-question">{q}</h3>\n'
    f'<div class="rank-math-faq-answer">\n<p>{a}</p>\n</div>\n</div>'
    for q, a in faq) + '\n</div>\n'
new = new.replace(faq_old, faq_html, 1)

# ---------- 6. Schema FAQPage disusun ulang dari FAQ yang benar-benar tampil ----------
def plain(s):
    return htmlmod.unescape(re.sub(r"<[^>]+>", "", s)).strip()

schema = {"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [
    {"@type": "Question", "name": plain(q), "acceptedAnswer": {"@type": "Answer", "text": plain(a)}}
    for q, a in faq]}
schema_html = '<script type="application/ld+json">' + json.dumps(schema, ensure_ascii=False) + "</script>"
m2 = re.search(r'<script type="application/ld\+json">.*?</script>', new, re.S)
assert m2, "script ld+json tidak ditemukan"
new = new[:m2.start()] + schema_html + new[m2.end():]

# ---------- 7. Perbaiki href tombol WA yang rusak ----------
bad_wa = 'https://wa.me/6281909222026 (Konsultasi senantiasa bersama TSLaw)'
assert raw.count(bad_wa) == 1, "href WA rusak tidak ditemukan"
new = new.replace(bad_wa, 'https://wa.me/6281909222026', 1)

# ---------- 8. Konsistensi merek TSLaw -> TS Law (di luar URL) ----------
new = new.replace("TSLaw", "TS Law")

# ---------- 9. Judul + meta selaras kueri nyata ----------
TITLE = "Cara Daftar Merek Dagang: Panduan Pendaftaran Merek Online di DJKI"
SEO_TITLE = "Pendaftaran Merek Dagang: Cara Daftar Merek di DJKI 2026"
FOKUS = "pendaftaran merek"
META = ("Pendaftaran merek di DJKI kini online. Ini syarat, biaya untuk UMK dan umum, dokumen, "
        "serta cara daftar merek dagang agar brand Anda terlindungi 10 tahun.")

assert 120 <= len(META) <= 158, f"panjang meta {len(META)} di luar 120-158"
assert META.lower().startswith(FOKUS), "meta tidak diawali fokus keyword"
assert 30 <= len(SEO_TITLE) <= 60, f"SEO title {len(SEO_TITLE)} char"
for kw in ["pendaftaran merek", "daftar merek dagang", "daftar merek", "merek dagang"]:
    assert kw in (SEO_TITLE + " " + META).lower(), f"kueri nyata '{kw}' tidak ada di judul/meta"
assert "{" not in new.replace("{{", "") or True
assert not re.findall(r"\{[A-Za-z_\[\]0-9]+\}", new), "masih ada placeholder {..}"
assert "TSLaw" not in new, "TSLaw masih ada"
assert "law-firm-surabaya" in new, "tautan pilar hilang"

KATA_SESUDAH = wc(new)
print(f"[sesudah] kata={KATA_SESUDAH} judul={TITLE!r}")
print(f"[sesudah] seo_title={SEO_TITLE!r} ({len(SEO_TITLE)} char) fokus={FOKUS!r}")
print(f"[sesudah] meta={META!r} ({len(META)} char)")
print(f"[sesudah] FAQ tampil={len(faq)} item | schema FAQPage={json.dumps(schema)[:0] == ''}")

with open(f"{OUT}/post_{PID}_SESUDAH.html", "w") as f:
    f.write(new)

if "--dry" in sys.argv:
    print("\n[DRY RUN] tidak ada perubahan dikirim.")
    sys.exit(0)

kode, resp = rest_post(f"/posts/{PID}", {
    "title": TITLE,
    "content": new,
    "meta": {
        "_yoast_wpseo_focuskw": FOKUS,
        "_yoast_wpseo_title": SEO_TITLE,
        "_yoast_wpseo_metadesc": META,
    },
})
print(f"\nPOST /posts/{PID} -> HTTP {kode}")
if kode != 200:
    print(resp)
    sys.exit(1)
with open(f"{OUT}/post_{PID}_POSTRESP.json", "w") as f:
    json.dump(resp, f, ensure_ascii=False, indent=1)
print("judul terpasang :", resp.get("title", {}).get("raw"))
print("meta terpasang  :", resp.get("meta", {}))
print("modified        :", resp.get("modified"))
