#!/usr/bin/env python3
"""DAS — konsolidasi klaster Nissan.

Kanonik : #5657 /bengkel-spesialis-nissan-surabaya (1.506 tayangan, 21 klik)
Gabung  : #8081 /bengkel-mobil-nissan-di-surabaya-servis-perbaikan-dan-overhaul-mesin (26 tayangan)

Isi yang belum ada di kanonik dipindahkan (ditulis ulang, bukan salin tempel), lalu #8081
dipensiunkan jadi draf. Salinan isi kedua halaman disimpan lebih dulu.
"""
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)

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"}

KANONIK, GABUNG = 5657, 8081

TAMBAHAN = """
<h2>Pekerjaan yang Termasuk dalam Servis Nissan di DAS Indonesia</h2>
<p>Kebanyakan pemilik Nissan datang dengan satu keluhan, lalu setelah diperiksa ternyata ada dua atau
tiga hal lain yang ikut berpengaruh. Karena itu setiap kendaraan yang masuk kami periksa menyeluruh
lebih dulu, baru pekerjaan disusun sesuai prioritas dan anggaran Anda.</p>

<p><strong>Servis berkala.</strong> Ganti oli mesin dan filter, cek filter udara dan kabin, periksa
busi, air radiator, minyak rem, serta kondisi kaki-kaki. Bagian ini yang menjaga mobil tetap nyaman
dan mencegah kerusakan yang lebih mahal.</p>

<p><strong>Perbaikan mesin.</strong> Penanganan mesin yang tidak mau menyala, mesin bergetar, tenaga
turun, konsumsi bahan bakar naik, sampai mesin yang mengeluarkan asap putih atau hitam. Semua
diputuskan setelah hasil pemeriksaan kompresi dan komputer diagnostik dibaca.</p>

<p><strong>Overhaul mesin.</strong> Pekerjaan besar ketika komponen di dalam mesin sudah aus:
bongkar total, ganti kepingan yang rusak, lalu rakit dan uji kembali. Waktunya lebih lama, tapi ini
jalan satu-satunya kalau kondisinya sudah sampai di titik itu.</p>

<p><strong>Transmisi CVT dan matic.</strong> Penggantian oli CVT sesuai jadwal, pemeriksaan tekanan
oli, dan penanganan gejala selip atau hentakan. Transmisi CVT Nissan paling tidak sabar kalau oli
dibiarkan sampai menghitam.</p>

<p><strong>Diagnosis dan kelistrikan.</strong> Kode kesalahan dibaca dengan alat diagnostik, termasuk
untuk keluhan yang muncul sesekali dan sulit ditangkap saat mobil diuji jalan.</p>

<p><strong>Sistem pendingin dan bahan bakar.</strong> Pembersihan radiator, penggantian cairan
pendingin, pemeriksaan selang dan pompa air, serta pembersihan injektor dan jalur bahan bakar.</p>

<h2>Jarak Servis Berkala yang Kami Pakai sebagai Patokan</h2>
<p>Jadwal di bawah ini patokan umum, bisa lebih cepat kalau mobil sering kena macet atau dipakai
untuk perjalanan jauh.</p>
<ul>
<li><strong>Setiap 5.000 sampai 10.000 km:</strong> ganti oli mesin dan filter, periksa tekanan angin,
rotasi ban, dan cek kebocoran di kolong mobil.</li>
<li><strong>Setiap 20.000 sampai 40.000 km:</strong> ganti filter udara, filter kabin, dan busi
sesuai tipe mesin, serta periksa kondisi minyak rem.</li>
<li><strong>Setiap 40.000 sampai 60.000 km:</strong> pemeriksaan menyeluruh untuk kaki-kaki, sabuk
penggerak, dan penggantian oli transmisi mengikuti kondisi hasil pemeriksaan.</li>
</ul>

<h2>Dealer Resmi atau Bengkel Spesialis Nissan?</h2>
<p>Dua-duanya sah dipakai, tergantung kebutuhan. Dealer resmi punya alat khusus dan suku cadang
resmi, tapi biaya perawatan berkala cenderung lebih tinggi dan waktu tunggu bisa panjang.</p>
<p>Bengkel spesialis biasanya unggul pada dua hal. Pertama, waktu pengerjaan yang lebih luwes dan
bisa didiskusikan. Kedua, ruang untuk memilih suku cadang: asli, setara pabrik, atau bekas layak
pakai, dengan penjelasan risiko masing-masing. Yang perlu Anda pastikan, apa pun pilihannya, adalah
kejelasan sebelum pekerjaan dimulai dan garansi setelah pekerjaan selesai.</p>

<h2>Cara Menilai Bengkel Nissan Sebelum Mobil Anda Diserahkan</h2>
<ul>
<li>Tanyakan siapa teknisi yang menangani dan apa pengalamannya dengan mesin Nissan, terutama CVT.</li>
<li>Pastikan alat diagnostik tersedia, karena banyak keluhan Nissan tidak terlihat tanpa pembacaan kode.</li>
<li>Minta rincian pekerjaan dan biaya sebelum dimulai, termasuk apa yang tidak termasuk di dalamnya.</li>
<li>Tanyakan garansi pekerjaan dan berapa lama masa berlakunya.</li>
<li>Lihat apakah bengkel bersedia menunjukkan komponen yang diganti, bukan hanya menyebutkan.</li>
</ul>

<h2>Model Nissan yang Kami Tangani</h2>
<p>Grand Livina, Livina, X-Trail, Juke, Serena, March, Navara, Elgrand, dan tipe lain yang masuk
ke jaringan mesin dan transmisi yang sama. Untuk tipe yang jarang kami temui, tetap kami periksa
dulu sebelum menyanggupi, karena salah menyanggupi lebih merugikan kedua pihak.</p>

<p><span style="font-weight:bold;">Baca juga:</span>
<a href="https://dasindonesia.com/bengkel-spesialis-matic-surabaya/">bengkel spesialis matic Surabaya</a>
dan
<a href="https://dasindonesia.com/bengkel-spesialis-engine-overhaul-di-surabaya-bukan-sekadar-bongkar-pasang-mesin/">layanan engine overhaul di Surabaya</a>
untuk pekerjaan yang saling berkaitan dengan perawatan Nissan.</p>
"""


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"


st, kan = rest(f"/wp-json/wp/v2/posts/{KANONIK}?context=edit&_fields=id,slug,title,content,meta,link")
st2, gab = rest(f"/wp-json/wp/v2/posts/{GABUNG}?context=edit&_fields=id,slug,title,content,meta,link")
if not isinstance(kan, dict) or not isinstance(gab, dict):
    print("❌ gagal membaca halaman:", st, str(kan)[:100], st2, str(gab)[:100])
    sys.exit(1)

raw = kan["content"]["raw"]
open(f"{BACKUP}/post_{KANONIK}_sebelum.txt", "w").write(raw)
open(f"{BACKUP}/post_{GABUNG}_sebelum.txt", "w").write(gab["content"]["raw"])
open(f"{BACKUP}/post_{GABUNG}_meta.json", "w").write(json.dumps(
    {"slug": gab["slug"], "title": gab["title"]["raw"], "meta": gab.get("meta"),
     "link": gab["link"]}, ensure_ascii=False, indent=1))

kata_lama = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
isi_baru = raw.rstrip() + "\n" + TAMBAHAN
kata_baru = len(html.unescape(re.sub(r"<[^>]+>", " ", isi_baru)).split())
print(f"kanonik #{KANONIK} «{html.unescape(kan['title']['raw'])}»")
print(f"  panjang: {kata_lama} → {kata_baru} kata (+{kata_baru - kata_lama})")
print(f"  yang digabung dari #{GABUNG} «{html.unescape(gab['title']['raw'])}» ({len(gab['content']['raw'].split())} kata kasar)")

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

st3, d3 = rest(f"/wp-json/wp/v2/posts/{KANONIK}", "POST", {"content": isi_baru})
time.sleep(2)
_, cek = rest(f"/wp-json/wp/v2/posts/{KANONIK}?context=edit&_fields=content")
raw2 = cek["content"]["raw"]
print(f"\n  #{KANONIK}: HTTP {st3} | isi tersimpan: {'cocok' if 'Pekerjaan yang Termasuk dalam Servis Nissan' in raw2 else 'TIDAK'}"
      f" | panjang sekarang {len(html.unescape(re.sub(r'<[^>]+>', ' ', raw2)).split())} kata")

st4, d4 = rest(f"/wp-json/wp/v2/posts/{GABUNG}", "POST", {"status": "draft"})
time.sleep(1)
_, cek2 = rest(f"/wp-json/wp/v2/posts/{GABUNG}?context=edit&_fields=status,slug")
print(f"  #{GABUNG}: HTTP {st4} | status sekarang {cek2.get('status')} | slug {cek2.get('slug')}")
print(f"\n  salinan sebelum perubahan: {BACKUP}/post_{KANONIK}_sebelum.txt dan post_{GABUNG}_sebelum.txt")
print(f"  pengalihan 301 yang perlu Bos pasang: /{gab['slug']}/ → /bengkel-spesialis-nissan-surabaya/")
