#!/usr/bin/env python3
"""DAS — konsolidasi batch 2: transmisi matic, Alphard, Mercy & BMW.

Kanonik diperkuat dengan isi yang belum ada (ditulis ulang), kembar dipensiunkan jadi draf.
Pakai --go untuk menulis.
"""
import base64, html, importlib.util, json, os, re, sys, time, urllib.error, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
BACKUP = f"{WS}/das_konsolidasi_backup"
os.makedirs(BACKUP, exist_ok=True)
PETA = {x["slug"]: x for x in json.load(open(f"{WS}/drafts/das_peta_konten.json"))}

spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_das.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
CFG = m.CFG
DOM = CFG["domain"]
AUTH = base64.b64encode(f"{CFG['user']}:{CFG['pass']}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}

MATIC = """
<h2>Jenis Transmisi Matic yang Kami Tangani</h2>
<p>Tidak semua matic bekerja dengan cara yang sama, dan salah menangani justru memperpendek usia
transmisi. Yang paling sering kami temui di Surabaya:</p>
<ul>
<li><strong>Matic konvensional (torque converter):</strong> umum di Toyota, Mitsubishi, dan sebagian
Honda. Perpindahan gigi terasa halus, perawatannya bergantung pada oli dan kondisi katup hidrolik.</li>
<li><strong>CVT:</strong> dipakai luas Nissan, Honda, dan sebagian Toyota. Memakai sabuk atau rantai
baja, paling sensitif terhadap kualitas dan jadwal oli.</li>
<li><strong>DCT dan transmisi kopling ganda:</strong> dijumpai pada mobil Eropa. Butuh alat diagnostik
khusus untuk membaca kondisi kopling dan aktuatornya.</li>
<li><strong>Tiptronic atau matic dengan mode manual:</strong> secara dasar tetap matic, hanya
penambahan kontrol manual pada perpindahannya.</li>
</ul>

<h2>Mengapa Oli Transmisi Tidak Boleh Dibiarkan Lewat Jadwal</h2>
<p>Oli transmisi bekerja pada suhu tinggi dan tekanan besar sepanjang waktu. Ketika sudah menghitam,
kemampuan melumasi dan memindahkan tekanan menurun, sehingga komponen di dalam mulai bergesek. Pada
tahap itu, gejalanya biasanya muncul dalam urutan seperti ini: hentakan saat pindah gigi, respons
terlambat ketika pedal ditekan, suara berdesir pelan, lalu mobil masuk ke mode pengaman dan menolak
berpindah gigi.</p>
<p>Servis yang dilakukan sebelum tahap ketiga umumnya cukup dengan penggantian oli dan pemeriksaan
tekanan. Kalau sudah masuk mode pengaman, pekerjaannya bisa menjadi overhaul transmisi.</p>

<h2>Jadwal Servis Transmisi Matic</h2>
<ul>
<li><strong>Setiap 40.000 km:</strong> periksa kondisi dan warna oli, cek kebocoran di sekitar pan
transmisi.</li>
<li><strong>Setiap 40.000 sampai 60.000 km:</strong> penggantian oli transmisi, disesuaikan dengan
hasil pemeriksaan dan cara pemakaian mobil.</li>
<li><strong>Nissan dan Honda bertransmisi CVT:</strong> umumnya lebih cepat, terutama kalau mobil
sering berhenti-jalan di dalam kota.</li>
</ul>

<h2>Cara Kami Memeriksa Transmisi Matic</h2>
<p>Pemeriksaan dimulai dari membaca keluhan dan riwayat servis, lalu uji jalan singkat untuk
merasakan perpindahan gigi di berbagai kecepatan. Setelah itu kode kesalahan dibaca lewat alat
diagnostik, tekanan oli diukur, dan kondisi oli dilihat langsung dari pan. Baru setelah itu
pekerjaan dan perkiraan biayanya disusun, termasuk kemungkinan mana yang masih bisa ditunda.</p>

<p><span style="font-weight:bold;">Baca juga:</span>
<a href="https://dasindonesia.com/bengkel-spesialis-nissan-surabaya/">perawatan transmisi CVT Nissan</a>
dan
<a href="https://dasindonesia.com/bengkel-honda-terbaik/">servis mobil Honda di Surabaya</a>.</p>
"""

ALPHARD = """
<h2>Bagian yang Paling Menentukan Kenyamanan Alphard</h2>
<p>Alphard dibeli bukan untuk kecepatan, tetapi untuk kenyamanan penumpang. Karena itu perawatan yang
paling berdampak justru di bagian yang menopang kenyamanan itu:</p>
<ul>
<li><strong>Kaki-kaki dan suspensi.</strong> Bush, link stabilizer, dan peredam yang mulai lemah
membuat kabin terasa bergetar, terutama saat melintasi jalan bergelombang.</li>
<li><strong>Sistem pendingin kabin.</strong> Kabin Alphard luas, jadi AC bekerja lebih keras daripada
mobil biasa. Filter kabin yang kotor membuat pendinginan terasa lebih lambat.</li>
<li><strong>Kedap suara dan karet pintu.</strong> Karet pintu yang mengeras menambah suara angin di
kabin, dan ini sering luput dari pemeriksaan rutin.</li>
<li><strong>Rem.</strong> Bobot mobil yang besar membuat kampas rem bekerja lebih berat dibanding MPV
biasa.</li>
</ul>

<h2>Alphard Bensin dan Hybrid: Beda Perhatian</h2>
<p>Pada versi bensin, perhatian utama ada di oli mesin, sistem pendingin, dan transmisi. Pada versi
hybrid, ada tambahan yang perlu dipantau: kondisi baterai traksi, sistem pendingin baterai, dan
inverter. Oli mesin tetap diganti sesuai jarak tempuh karena mesin bensinnya tetap bekerja, hanya
saja porsi kerjanya lebih ringan.</p>

<h2>Jadwal Perawatan yang Kami Pakai sebagai Patokan</h2>
<ul>
<li><strong>Setiap 5.000 sampai 10.000 km:</strong> oli mesin dan filter, pemeriksaan rem serta
kaki-kaki.</li>
<li><strong>Setiap 20.000 km:</strong> filter udara dan filter kabin, pemeriksaan busi dan kondisi
sistem pendingin.</li>
<li><strong>Setiap 40.000 km ke atas:</strong> pemeriksaan menyeluruh kaki-kaki, oli transmisi, dan
pada versi hybrid ditambah pemeriksaan baterai traksi.</li>
</ul>

<h2>Sekilas Soal Suku Cadang</h2>
<p>Untuk mobil premium seperti Alphard, kami terbuka menyebutkan pilihan yang ada: suku cadang
orisinal, setara pabrik, atau bekas layak pakai, lengkap dengan selisih harga dan risikonya. Semua
pilihan itu kami sampaikan sebelum pekerjaan dimulai supaya keputusan tetap di tangan Anda.</p>

<p><span style="font-weight:bold;">Baca juga:</span>
<a href="https://dasindonesia.com/bengkel-mobil-hybrid-terbaik-di-surabaya/">perawatan mobil hybrid di Surabaya</a>
dan
<a href="https://dasindonesia.com/bengkel-spesialis-matic-surabaya/">servis transmisi matic</a>.</p>
"""

MERCY = """
<h2>Mengapa Mobil Eropa Butuh Penanganan yang Berbeda</h2>
<p>BMW dan Mercedes dibangun dengan toleransi yang lebih rapat dan jumlah modul elektronik yang lebih
banyak dibanding mobil Jepang. Ada tiga hal yang membuat penanganannya berbeda.</p>
<p><strong>Pertama, spesifikasi oli dan cairan.</strong> Oli mesin, oli transmisi, dan cairan pendingin
memiliki standar khusus. Memakai oli yang tidak memenuhi standar mempercepat keausan, dan itu tidak
langsung terasa.</p>
<p><strong>Kedua, pembacaan modul.</strong> Banyak keluhan pada mobil ini tidak berasal dari mesin,
tapi dari modul lain: sensor, sistem bahan bakar, atau kelistrikan. Tanpa alat yang bisa membaca semua
modul, diagnosisnya cenderung menebak.</p>
<p><strong>Ketiga, suku cadang yang jarang.</strong> Sebagian komponen perlu dipesan lebih dulu,
sehingga perencanaan pekerjaan menentukan berapa lama mobil berada di bengkel.</p>

<h2>Servis Berkala BMW dan Mercedes yang Kami Sarankan</h2>
<ul>
<li><strong>Setiap 10.000 km:</strong> oli mesin dan filter, pemeriksaan rem, ban, serta cairan
pendingin.</li>
<li><strong>Setiap 20.000 sampai 30.000 km:</strong> filter udara, filter kabin, busi, dan pemeriksaan
sistem bahan bakar.</li>
<li><strong>Setiap 60.000 km ke atas:</strong> pemeriksaan menyeluruh untuk kaki-kaki, sistem pendingin,
dan transmisi sesuai hasil pemeriksaan.</li>
</ul>

<h2>Keluhan yang Paling Sering Kami Temui</h2>
<ul>
<li>Lampu peringatan mesin menyala, kadang hilang sendiri setelah beberapa hari.</li>
<li>Suara berdecit dari area kaki-kaki saat melewati jalan bergelombang.</li>
<li>Konsumsi oli yang mulai tidak wajar di antara dua jadwal servis.</li>
<li>Kelistrikan yang tidak konsisten, misalnya modul yang kadang tidak merespons.</li>
</ul>

<h2>Soal Suku Cadang dan Kejelasan Biaya</h2>
<p>Untuk mobil Eropa, selisih harga antara suku cadang orisinal, setara pabrik, dan bekas layak pakai
sangat besar. Kami menyebutkan pilihannya lebih dulu, termasuk risiko masing-masing, sebelum pekerjaan
dimulai. Anda juga tetap memegang keputusan untuk menunda pekerjaan yang belum mendesak, asalkan
alasannya jelas.</p>

<p><span style="font-weight:bold;">Baca juga:</span>
<a href="https://dasindonesia.com/bengkel-spesialis-matic-surabaya/">servis transmisi matic</a>
dan
<a href="https://dasindonesia.com/bengkel-spesialis-engine-overhaul-di-surabaya-bukan-sekadar-bongkar-pasang/">engine overhaul di Surabaya</a>.</p>
"""

BATCH = [
    ("Transmisi matic", "bengkel-spesialis-matic-surabaya",
     ["bengkel-spesialis-matic-surabaya-teknisi-juara-toyota-di-das-indonesia",
      "bengkel-transmisi-matic-honda-di-surabaya-perawatan-overhaul-yang-tepat"], MATIC),
    ("Alphard", "bengkel-spesialis-alphard-surabaya",
     ["bengkel-mobil-alphard", "bengkel-spesialis-alphard",
      "bengkel-mobil-mewah-di-surabaya-panduan-merawat-alphard-land-cruiser-dan-sedan-premium"], ALPHARD),
    ("Mercy & BMW", "bengkel-mobil-bmw-mercy-surabaya",
     ["bengkel-mercy-surabaya-terpercaya-pilih-bengkel-das-surabaya", "bengkel-mercy-surabaya"], MERCY),
]


def rest(path, 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}{path}", 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()[:250]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


def kata(raw):
    return len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())


go = "--go" in sys.argv
for nama, kan_slug, gab_slugs, tambahan in BATCH:
    kan = PETA.get(kan_slug)
    if not kan:
        print(f"❌ {nama}: kanonik slug tidak ditemukan ({kan_slug})")
        continue
    st, k = rest(f"/wp-json/wp/v2/posts/{kan['id']}?context=edit&_fields=id,slug,title,content,link")
    if not isinstance(k, dict):
        print(f"❌ {nama}: gagal baca kanonik ({st})")
        continue
    raw = k["content"]["raw"]
    baru = raw.rstrip() + "\n" + tambahan
    print(f"\n■ {nama} — kanonik #{kan['id']} /{kan_slug}: {kata(raw)} → {kata(baru)} kata")
    for s in gab_slugs:
        g = PETA.get(s)
        print(f"   gabung {('#' + str(g['id'])) if g else '(tidak ada di peta)':>7} | {s[:70]}")

    if not go:
        continue
    open(f"{BACKUP}/post_{kan['id']}_sebelum.txt", "w").write(raw)
    st2, _ = rest(f"/wp-json/wp/v2/posts/{kan['id']}", "POST", {"content": baru})
    time.sleep(2)
    _, cek = rest(f"/wp-json/wp/v2/posts/{kan['id']}?context=edit&_fields=content")
    ok = st2 == 200 and kata(cek["content"]["raw"]) == kata(baru)
    print(f"   kanonik: HTTP {st2} | {'✅ tersimpan utuh' if ok else '❌ periksa lagi'}")
    for s in gab_slugs:
        g = PETA.get(s)
        if not g:
            continue
        _, gg = rest(f"/wp-json/wp/v2/posts/{g['id']}?context=edit&_fields=content")
        if isinstance(gg, dict):
            open(f"{BACKUP}/post_{g['id']}_sebelum.txt", "w").write(gg["content"]["raw"])
        st3, _ = rest(f"/wp-json/wp/v2/posts/{g['id']}", "POST", {"status": "draft"})
        time.sleep(1)
        _, c2 = rest(f"/wp-json/wp/v2/posts/{g['id']}?context=edit&_fields=status")
        print(f"   #{g['id']}: HTTP {st3} → status {c2.get('status')}")

if not go:
    print("\n(dry run — pakai --go)")
