#!/usr/bin/env python3
"""Perbaikan harian tslaw.id 2026-10-09 - post 3232
/panduan-cerai-gugat/

Dasar pemilihan (audit drafts/tslaw_audit_selaras.json, snapshot 8 Okt 2026):
- Prioritas 1 sudah habis: 7 artikel dengan tayangan/posisi 11-30 (3065, 3057, 3233,
  3208, 3230, 2940, 2823) semuanya sudah digarap 2-8 Okt.
- Prioritas 2: artikel 600-900 kata. #3232 = 754 kata (metrik audit) / 609 kata
  (tanpa skema FAQ), 18 sesi GA4 90 hari -> permintaan tertinggi di kelompok ini,
  dan tidak punya tautan pilar. #3234 = 803 kata / 10 sesi.

Perbaikan yang dikerjakan HARI INI = panjangkan artikel menjadi 1.000+ kata
(tanpa skema FAQ) dengan isi baru yang benar-benar berguna. Judul, slug, meta,
tombol WA, dan skema FAQPage tidak diubah (sudah benar). Tautan pilar
/law-firm-surabaya/ sengaja TIDAK ditambahkan di sini karena itu perbaikan
prioritas 5 untuk hari lain (aturan: tepat 1 perbaikan per hari).

Jalankan tanpa argumen = dry run. Tambah --apply untuk menulis via REST (JSON).
"""
import base64, html as htmlmod, json, os, re, sys
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 = "https://tslaw.id/wp-json/wp/v2"
HDR = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}

PID = 3232
OUT = f"{WS}/tslaw_pemulihan/perbaikan_20261009"
os.makedirs(OUT, exist_ok=True)
APPLY = "--apply" in sys.argv


def rest_get(path, timeout=120):
    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):
    req = urllib.request.Request(
        BASE + path, data=json.dumps(payload).encode(),
        headers={**HDR, "Content-Type": "application/json"}, 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]


def wc_tanpa_skema(s):
    """Hitungan kata yang dipakai laporan harian: skrip/skema TIDAK dihitung."""
    t = htmlmod.unescape(re.sub(r"<(script|style).*?</\1>", " ", s, flags=re.S))
    return len(re.sub(r"<[^>]+>", " ", t).split())


def wc_audit(s):
    """Hitungan kata metrik audit (isi skrip ikut dihitung) - untuk pembanding."""
    t = htmlmod.unescape(s)
    return len(re.sub(r"<[^>]+>", " ", t).split())


# ---------------------------------------------------------------- tarik sebelum
p = rest_get(f"/posts/{PID}?context=edit")
raw = p["content"]["raw"]
open(f"{OUT}/post_{PID}_SEBELUM.html", "w").write(raw)
json.dump(p, open(f"{OUT}/post_{PID}_SEBELUM.json", "w"), ensure_ascii=False, indent=1)
KATA_SEBELUM = wc_tanpa_skema(raw)
KATA_AUDIT_SEBELUM = wc_audit(raw)
meta0 = p.get("meta") or {}
print(f"[sebelum] kata (tanpa skema) = {KATA_SEBELUM} | kata metrik audit = {KATA_AUDIT_SEBELUM}")
print(f"[sebelum] judul : {p['title']['raw']!r}")
print(f"[sebelum] fokus : {meta0.get('_yoast_wpseo_focuskw')!r}")
print(f"[sebelum] slug  : {p['slug']!r} (TIDAK diubah)")

# ------------------------------------------------------------------ isi tambahan
PERBANDINGAN = """
<h2>Cerai Gugat dan Cerai Talak: Letak Perbedaannya</h2>
<p>Banyak orang menyebut semua perceraian sebagai cerai gugat, padahal keduanya berbeda. Cerai talak diajukan suami dalam bentuk permohonan, sedangkan cerai gugat diajukan istri dalam bentuk gugatan ke Pengadilan Agama. Perbedaan ini menentukan siapa yang berkedudukan sebagai penggugat atau pemohon, cara pemanggilan pihak, dan siapa yang lebih dulu harus membuktikan alasannya di persidangan.</p>
<p>Untuk pasangan non-Muslim, perceraian diajukan ke Pengadilan Negeri, bukan Pengadilan Agama. Selebihnya tahapannya mirip: ada mediasi, ada sidang pembuktian, dan ada putusan yang mengatur nafkah serta hak asuh anak. Karena itu, tentukan dulu pengadilan mana yang berwenang atas perkara Anda. Berkas yang salah alamat tidak akan diproses, dan waktu Anda terbuang hanya untuk mendaftar ulang.</p>
"""

WAKTU_BIAYA = """
<h2>Berapa Lama dan Berapa Biaya Cerai Gugat?</h2>
<p>Dua pertanyaan ini biasanya menyusul begitu tahapan perkara dipahami. Pada praktiknya, perkara cerai gugat yang tidak rumit selesai dalam 3 sampai 6 bulan. Perkara bisa lebih panjang bila tergugat sulit dipanggil, alamatnya berpindah, atau yang bersangkutan tidak pernah hadir sehingga pengadilan perlu menempuh panggilan umum lewat pengumuman. Perkara yang memperebutkan hak asuh anak atau harta bersama juga biasanya menempuh lebih banyak sidang.</p>
<p>Biaya lewat pengadilan terdiri dari dua bagian. Pertama, biaya panjar perkara yang disetorkan di awal ke kas pengadilan, umumnya sekitar Rp500 ribu sampai Rp2 juta. Angka itu bukan tarif tetap, sebab biaya pemanggilan dihitung dari jarak pengadilan ke alamat para pihak, ditambah biaya materai, redaksi, dan pemberitahuan putusan. Kedua, honorarium pengacara bila Anda memakai jasa pendampingan, yang besarnya ditentukan dari lingkup pekerjaan dan tingkat kesulitan perkara. Mintalah rincian pekerjaan dan biaya sejak awal supaya tidak ada angka yang muncul mendadak di tengah proses.</p>
"""

ONLINE = """
<h2>Bisakah Cerai Gugat Diajukan Online?</h2>
<p>Pendaftaran perkara saat ini bisa dilakukan secara elektronik lewat layanan e-Court. Penggugat, atau pengacara yang mendampinginya, mendaftarkan gugatan, membayar panjar, dan menerima dokumen secara daring tanpa perlu berulang kali datang ke loket pengadilan. Untuk persidangan, pengadilan dapat menetapkan sidang jarak jauh lewat e-Litigasi, namun tidak semua agenda bisa daring. Sidang yang membutuhkan kehadiran langsung para pihak tetap dapat diperintahkan hadir di ruang sidang.</p>
<p>Agar bisa memakai layanan ini, Anda memerlukan akun e-Court yang terverifikasi. Bila belum pernah mengurusnya, pendampingan pengacara biasanya lebih praktis: berkas diunggah oleh pihak yang sudah terbiasa dengan sistem, sehingga kesalahan format yang membuat pendaftaran ditolak bisa dihindari.</p>
"""

KENDALA = """
<h2>Yang Membuat Gugatan Cerai Berlarut-larut</h2>
<p>Dari perkara keluarga yang kami tangani, ada tiga hal yang paling sering memperlambat proses. Pertama, gugatan yang tidak menyebutkan alasan perceraian secara jelas. Hakim perlu membaca uraian peristiwa yang konkret, bukan kalimat umum seperti sudah tidak cocok lagi. Kedua, tidak ada bukti pendukung. Perselisihan yang terus-menerus perlu ditopang keterangan saksi, pesan, atau dokumen lain agar tidak berhenti menjadi klaim sepihak. Ketiga, identitas dan alamat tergugat yang tidak akurat, sebab pemanggilan yang gagal otomatis menunda sidang berikutnya.</p>
<p>Yang juga sering terjadi: suami mengajukan gugatan balik atau rekonvensi yang meminta hak asuh anak maupun pembagian harta bersama. Gugatan balik bukan tanda proses Anda gagal, melainkan bagian dari perkara yang harus dijawab dengan bukti. Menyiapkan jawaban dan bukti sejak awal menjaga posisi Anda tetap utuh saat sidang berjalan.</p>
"""

KONTEN = raw

# 1) sisipkan perbandingan cerai gugat vs cerai talak
JANGKAR_A = ("Dasar hukum cerai gugat diatur dalam Undang-Undang Nomor 1 Tahun 1974 "
             "tentang Perkawinan dan Kompilasi Hukum Islam.</p>\n<!-- /wp:paragraph -->")
assert KONTEN.count(JANGKAR_A) == 1, "jangkar A tidak unik"
KONTEN = KONTEN.replace(JANGKAR_A, JANGKAR_A + "\n" + PERBANDINGAN.strip(), 1)

# 2) waktu dan biaya setelah langkah sidang
JANGKAR_B = "Jika hakim yakin alasan perceraian cukup kuat, gugatan akan dikabulkan.</p>"
assert KONTEN.count(JANGKAR_B) == 1, "jangkar B tidak unik"
KONTEN = KONTEN.replace(JANGKAR_B, JANGKAR_B + "\n" + WAKTU_BIAYA.strip(), 1)

# 3) e-Court + kendala, tepat sebelum bagian FAQ
JANGKAR_C = '<h2 class="wp-block-heading">Pertanyaan Umum Seputar Cerai Gugat</h2>'
assert KONTEN.count(JANGKAR_C) == 1, "jangkar C tidak unik"
KONTEN = KONTEN.replace(JANGKAR_C, ONLINE.strip() + "\n" + KENDALA.strip() + "\n" + JANGKAR_C, 1)

KATA_SESUDAH = wc_tanpa_skema(KONTEN)
KATA_AUDIT_SESUDAH = wc_audit(KONTEN)
print(f"\n[kata] tanpa skema {KATA_SEBELUM} -> {KATA_SESUDAH} (+{KATA_SESUDAH - KATA_SEBELUM})")
print(f"[kata] metrik audit {KATA_AUDIT_SEBELUM} -> {KATA_AUDIT_SESUDAH}")
assert KATA_SESUDAH >= 1000, f"target 1.000+ kata belum tercapai ({KATA_SESUDAH})"
assert KATA_SESUDAH > KATA_SEBELUM + 350, "tambahan isi terlalu tipis"

# ------------------------------------------------------------- pemeriksa teks baru
BARU = PERBANDINGAN + WAKTU_BIAYA + ONLINE + KENDALA
cekal = {
    "em dash": BARU.count("\u2014"),
    "kutip melengkung": len(re.findall(r"[\u2018\u2019\u201c\u201d]", BARU)),
    "CJK": len(re.findall(r"[\u3000-\u9fff]", BARU)),
    "placeholder": len(re.findall(r"\{[A-Za-z_\[0-9]+\}", BARU)),
    "frasa AI": len(re.findall(r"(Di era digital|Dalam dunia yang|Selain itu|Tak dapat dipungkiri|Pada era|Mari kita)",
                               BARU, re.I)),
    "klaim angka tak berdasar": len(re.findall(r"(\d{2,3}\s?%|pasti menang|100%|dijamin)", BARU, re.I)),
}
print("[periksa teks baru]", cekal)
assert sum(cekal.values()) == 0, "teks baru tidak lolos pemeriksa"

# angka biaya harus konsisten dengan FAQ yang sudah ada di halaman
assert "Rp500 ribu sampai Rp2 juta" in WAKTU_BIAYA
assert "Rp500.000 hingga Rp2.000.000" in KONTEN, "angka FAQ lama hilang"
assert "3 sampai 6 bulan" in WAKTU_BIAYA and "3-6 bulan" in KONTEN

# ------------------------------------------------------------------ keutuhan lain
for_cek = {
    "tombol WA": KONTEN.count("wa.me/6281909222026"),
    "skema FAQPage": KONTEN.count('"@type": "FAQPage"'),
    "h2": len(re.findall(r"<h2", KONTEN)),
    "h3": len(re.findall(r"<h3", KONTEN)),
    "tautan pilar": KONTEN.count("law-firm-surabaya"),
}
print("[utuh]", for_cek)
assert for_cek["tombol WA"] == 1 and for_cek["skema FAQPage"] == 1

# bukti tidak ada bagian lain yang tersentuh: balikkan tiga sisipan -> harus identik
BALIK = (KONTEN.replace("\n" + PERBANDINGAN.strip(), "", 1)
         .replace("\n" + WAKTU_BIAYA.strip(), "", 1)
         .replace(ONLINE.strip() + "\n" + KENDALA.strip() + "\n", "", 1))
assert BALIK == raw, "ada perubahan di luar tiga sisipan yang direncanakan"
print("[integritas] sisa artikel identik dengan versi sebelum (3 sisipan saja)")

if not APPLY:
    open(f"{OUT}/post_{PID}_SESUDAH_dryrun.html", "w").write(KONTEN)
    print("\n[DRY RUN] tidak ada yang dikirim. Jalankan dengan --apply bila sudah benar.")
    sys.exit(0)

payload = {"content": KONTEN}  # judul/meta/slug sengaja tidak dikirim
kode, resp = rest_post(f"/posts/{PID}", payload)
print(f"\n[POST] status {kode}")
json.dump(resp, open(f"{OUT}/post_{PID}_POSTRESP.json", "w"), ensure_ascii=False, indent=1)
if kode != 200:
    print("GAGAL:", resp)
    sys.exit(1)

# ------------------------------------------------------------- baca ulang dari API
q = rest_get(f"/posts/{PID}?context=edit")
raw2 = q["content"]["raw"]
open(f"{OUT}/post_{PID}_SESUDAH.html", "w").write(raw2)
verif = {
    "id": PID, "slug": q["slug"], "status": q["status"], "link": q["link"],
    "modified": q["modified"], "judul": q["title"]["raw"],
    "kata_tanpa_skema_sebelum": KATA_SEBELUM, "kata_tanpa_skema_sesudah": wc_tanpa_skema(raw2),
    "kata_metrik_audit_sebelum": KATA_AUDIT_SEBELUM, "kata_metrik_audit_sesudah": wc_audit(raw2),
    "sisipan_perbandingan": "Cerai Gugat dan Cerai Talak: Letak Perbedaannya" in raw2,
    "sisipan_waktu_biaya": "Berapa Lama dan Berapa Biaya Cerai Gugat?" in raw2,
    "sisipan_online": "Bisakah Cerai Gugat Diajukan Online?" in raw2,
    "sisipan_kendala": "Yang Membuat Gugatan Cerai Berlarut-larut" in raw2,
    "faq_utuh": raw2.count('"@type": "FAQPage"') == 1,
    "tombol_wa": raw2.count("wa.me/6281909222026"),
    "h2": len(re.findall(r"<h2", raw2)), "h3": len(re.findall(r"<h3", raw2)),
    "identik_di_luar_sisipan": (raw2.replace("\n" + PERBANDINGAN.strip(), "", 1)
                                .replace("\n" + WAKTU_BIAYA.strip(), "", 1)
                                .replace(ONLINE.strip() + "\n" + KENDALA.strip() + "\n", "", 1)) == raw,
}
json.dump(verif, open(f"{OUT}/post_{PID}_VERIFIKASI.json", "w"), ensure_ascii=False, indent=1)
print("[verifikasi REST]", json.dumps(verif, ensure_ascii=False, indent=1))
