#!/usr/bin/env python3
"""Perbaikan DAS: judul SEO + focus keyphrase + meta description (≤158) + link internal antar klaster.
Dry run default; --apply untuk POST."""
import base64, json, re, sys, time, urllib.request, urllib.error

SITE = "https://dasindonesia.com"
AUTH = base64.b64encode(b"bambangbot:u3a1 G2pQ 3SWY f0zI OlGP YAjU").decode()

# id: (focus keyphrase, SEO title, meta description, [(url_atau_id, anchor)])
LINK = {
    "alphard_main": "https://dasindonesia.com/bengkel-spesialis-alphard-surabaya/",
    "lexus_main": "https://dasindonesia.com/bengkel-spesialis-lexus-di-surabaya/",
    "mercy_main": "https://dasindonesia.com/bengkel-mercy-surabaya/",
    "toyota_main": "https://dasindonesia.com/bengkel-spesialis-toyota-surabaya/",
    "matic": "https://dasindonesia.com/bengkel-spesialis-matic-surabaya/",
    "nissan": "https://dasindonesia.com/bengkel-spesialis-nissan-surabaya/",
    "eap": "https://dasindonesia.com/bengkel-mobil-mewah-di-surabaya-panduan-merawat-alphard-land-cruiser-dan-sedan-premium/",
}

JOBS = {
    5569: ("bengkel spesialis alphard surabaya", "Bengkel Spesialis Alphard Surabaya — Servis & Overhaul",
           "Bengkel spesialis alphard surabaya untuk servis rutin, AC, matic, sampai overhaul mesin. Teknisi berpengalaman dan garansi pekerjaan.", []),
    5684: ("bengkel lexus surabaya", "Bengkel Lexus Surabaya — Servis & Overhaul Mobil Premium",
           "Bengkel lexus surabaya untuk servis rutin, AC, sampai overhaul mesin mobil premium. Ditangani teknisi berpengalaman, reservasi via WhatsApp.", []),
    5609: ("bengkel matic surabaya", "Bengkel Matic Surabaya — Spesialis Transmisi AT & CVT",
           "Bengkel matic surabaya spesialis transmisi otomatis dan CVT: perawatan, perbaikan, sampai overhaul. Diagnosis akurat oleh teknisi berpengalaman.", []),
    5657: ("bengkel nissan surabaya", "Bengkel Nissan Surabaya — Servis, Matic & Overhaul",
           "Bengkel nissan surabaya terdekat untuk servis rutin, transmisi matic, sampai overhaul mesin. Diagnosis akurat dan garansi pekerjaan.", []),
    5552: ("bengkel toyota terdekat", "Bengkel Toyota Terdekat di Surabaya — DAS Bengkel",
           "Bengkel toyota terdekat di Surabaya, di kawasan Jagir. Servis berkala, kaki-kaki, AC, sampai overhaul dengan teknisi berpengalaman.",
           [(LINK["toyota_main"], "bengkel spesialis Toyota Surabaya"), (LINK["nissan"], "bengkel spesialis Nissan Surabaya")]),
    6420: ("bengkel bmw surabaya", "Bengkel BMW Surabaya — Servis & Overhaul Mobil Premium",
           "Bengkel bmw surabaya untuk servis, diagnosis, dan perbaikan mesin mobil premium. Satu tempat juga melayani Mercedes-Benz di kawasan Jagir.",
           [(LINK["mercy_main"], "bengkel Mercy Surabaya")]),
    6711: ("servis mercy surabaya", "Servis Mercy Surabaya — Perawatan Mercedes-Benz",
           "Servis mercy surabaya untuk perawatan berkala sampai perbaikan mesin Mercedes-Benz. Bengkel DAS menangani kelistrikan, matic, dan kaki-kaki.",
           [(LINK["mercy_main"], "bengkel mercy surabaya")]),
    6566: ("perawatan mobil alphard", "Perawatan Mobil Alphard — Panduan & Layanan",
           "Perawatan mobil alphard mencakup servis berkala, AC, matic, dan kaki-kaki. Ini yang sering terlewat, plus tanda mesin butuh overhaul.",
           [(LINK["alphard_main"], "bengkel spesialis Alphard Surabaya")]),
    6304: ("bengkel mobil alphard surabaya", "Bengkel Mobil Alphard Surabaya — Perawatan Premium",
           "Bengkel mobil alphard surabaya untuk perawatan MPV premium: mesin, matic, AC, sampai overhaul. Ditangani teknisi yang menangani Alphard tiap hari.",
           [(LINK["alphard_main"], "bengkel spesialis alphard surabaya")]),
    6705: ("servis mobil lexus surabaya", "Servis Mobil Lexus Surabaya — Teknisi Bersertifikat",
           "Servis mobil lexus surabaya dengan alat diagnostik terbaru dan mekanik bersertifikat. Mulai perawatan berkala sampai overhaul mesin.",
           [(LINK["lexus_main"], "bengkel lexus surabaya")]),
    6772: ("perawatan mobil lexus", "Perawatan Mobil Lexus — Panduan Perawatan Premium",
           "Perawatan mobil lexus butuh peralatan dan pemahaman khusus. Ini layanan yang tersedia, plus tips memilih bengkel spesialis di Surabaya.",
           [(LINK["lexus_main"], "bengkel spesialis Lexus di Surabaya")]),
    5705: ("bengkel ac lexus surabaya", "Bengkel AC Lexus Surabaya — Perbaikan & Perawatan",
           "Bengkel ac lexus surabaya untuk AC yang tidak dingin, bocor, atau berbau. Pengecekan menyeluruh sampai kompresor dan sistem kelistrikan.",
           [(LINK["lexus_main"], "bengkel lexus surabaya")]),
    6708: ("rekomendasi bengkel lexus surabaya", "Rekomendasi Bengkel Lexus Surabaya — DAS Indonesia",
           "Rekomendasi bengkel lexus surabaya dengan tenaga ahli dan peralatan modern. Simak alasan DAS Indonesia jadi pilihan pemilik mobil premium.",
           [(LINK["lexus_main"], "bengkel spesialis Lexus di Surabaya")]),
}


def api(path, data=None, method="GET"):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(SITE + path, data=body, headers=h, method=method)
    try:
        with urllib.request.urlopen(r, timeout=240) as x:
            return x.status, json.loads(x.read())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode()[:300]


apply_ = "--apply" in sys.argv
ok = bad = 0
for pid, (fk, title, meta, links) in sorted(JOBS.items()):
    mt = f"{title} | BENGKEL DAS INDONESIA"
    valid = 120 <= len(meta) <= 158 and meta.lower().startswith(fk.lower())
    print(f"{'OK ' if valid else 'CEK'} #{pid} meta={len(meta):>3} title={len(title):>2} fk-start={'Y' if meta.lower().startswith(fk.lower()) else 'N'} | {fk}")
    if not valid:
        bad += 1
    if apply_ and valid:
        st, res = api(f"/wp-json/wp/v2/posts/{pid}", {"meta": {"_yoast_wpseo_focuskw": fk,
                                                               "_yoast_wpseo_title": mt,
                                                               "_yoast_wpseo_metadesc": meta}})
        # verifikasi dengan BACA ULANG (context=edit), bukan dari balasan POST
        stv, now = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=meta")
        curmeta = now.get("meta", {}) if isinstance(now, dict) else {}
        cek = curmeta.get("_yoast_wpseo_metadesc") == meta and curmeta.get("_yoast_wpseo_focuskw") == fk
        # link internal
        if links:
            st2, cur = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
            raw = cur["content"]["raw"]
            baru = [f'<li><a href="{u}">{a}</a></li>' for u, a in links if u not in raw]
            if baru:
                m = re.search(r"(<h2>\s*Baca Juga\s*</h2>\s*<ul>)(.*?)(</ul>)", raw, re.S | re.I)
                if m:
                    newraw = raw[:m.end(2)] + "\n" + "\n".join(baru) + "\n" + raw[m.end(2):]
                else:
                    blok = "\n<h2>Baca Juga</h2>\n<ul>" + "\n".join(baru) + "</ul>\n"
                    mm = re.search(r"\n<h2>\s*(FAQ|Kesimpulan)", raw, re.I)
                    newraw = (raw[:mm.start()] + blok + raw[mm.start():]) if mm else (raw.rstrip() + "\n" + blok)
                api(f"/wp-json/wp/v2/posts/{pid}", {"content": newraw})
                stc, chk = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
                print(f"     link internal: {'masuk' if 'Baca Juga' in chk['content']['raw'] else 'GAGAL'}")
        print(f"     meta POST {st} | tersimpan: {'Y' if cek else 'N'}")
        time.sleep(2)
        ok += 1 if cek else 0

print(f"\ntotal {len(JOBS)} | valid {len(JOBS)-bad} | perlu dicek {bad} | ter-apply {ok}")
