#!/usr/bin/env python3
"""Perbaikan meta + link internal DAS — versi tahan-retry (origin DAS suka stall).
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()

L = {
    "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/",
    "nissan": "https://dasindonesia.com/bengkel-spesialis-nissan-surabaya/",
}

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.",
           [(L["toyota_main"], "bengkel spesialis Toyota Surabaya"), (L["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.",
           [(L["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.",
           [(L["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.",
           [(L["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.",
           [(L["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.",
           [(L["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.",
           [(L["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.",
           [(L["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.",
           [(L["lexus_main"], "bengkel spesialis Lexus di Surabaya")]),
}


def api(path, data=None, method=None, coba=3):
    method = method or ("POST" if data is not None else "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"
    last = ""
    for i in range(coba):
        try:
            r = urllib.request.Request(SITE + path, data=body, headers=h, method=method)
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            last = f"HTTP {e.code}: {e.read().decode()[:120]}"
        except Exception as e:
            last = f"{type(e).__name__}: {str(e)[:120]}"
        time.sleep(3)
    return 0, last


apply_ = "--apply" in sys.argv
terap = []
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())
    if not valid:
        print(f"CEK #{pid} meta={len(meta)} fk-start={meta.lower().startswith(fk.lower())}")
        continue
    if not apply_:
        print(f"OK  #{pid} meta={len(meta):>3} | {fk}")
        continue
    st, _ = api(f"/wp-json/wp/v2/posts/{pid}", {"meta": {"_yoast_wpseo_focuskw": fk,
                                                         "_yoast_wpseo_title": mt,
                                                         "_yoast_wpseo_metadesc": meta}})
    stv, now = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=meta")
    cm = now.get("meta", {}) if isinstance(now, dict) else {}
    cek = cm.get("_yoast_wpseo_metadesc") == meta and cm.get("_yoast_wpseo_focuskw") == fk
    pesan = f"OK  #{pid} meta {st}"
    if not cek:
        pesan = f"GAGAL #{pid} meta {st} | baca-ulang {stv} {str(now)[:100]}"
    if links and cek:
        st2, cur = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
        if isinstance(cur, dict):
            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})
                _, chk = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
                pesan += f" | link: {'masuk' if isinstance(chk, dict) and 'Baca Juga' in chk['content']['raw'] else 'GAGAL'}"
    print(pesan)
    terap.append(cek)

if apply_:
    print(f"\nselesai: {sum(terap)}/{len(terap)} tersimpan")
