#!/usr/bin/env python3
"""Batch A — focus keyphrase + meta description untuk 16 artikel LEIT yang kosong + perbaiki #3827.
Mode: DRY (default) hanya cek panjang; --apply untuk POST ke WP."""
import base64, json, sys, urllib.request, urllib.error

SITE = "https://www.leitsurabaya.com"
AUTH = base64.b64encode(b"bambangbot:zibd dLIV xY8x onP9 39qL hiNr").decode()

JOBS = {
    4147: ("bahasa Inggris untuk anak",
           "Bahasa Inggris untuk anak paling efektif lewat bermain, bukan hafalan. Ini 7 metode seru, aktivitas harian 15 menit, dan tips praktis untuk orang tua."),
    4145: ("bahasa Inggris untuk traveling",
           "Bahasa Inggris untuk traveling bikin perjalanan lancar: frasa penting di bandara, hotel, restoran, sampai situasi darurat dalam satu panduan praktis."),
    4143: ("bahasa Inggris untuk beasiswa",
           "Bahasa Inggris untuk beasiswa menentukan lolos tidaknya seleksi LPDP sampai Chevening. Simak syarat skor, 6 langkah persiapan, dan tips motivation letter."),
    4141: ("bahasa Inggris untuk wawancara kerja",
           "Bahasa Inggris untuk wawancara kerja: 5 pertanyaan umum, contoh jawaban, metode STAR, dan kosakata penting agar lolos seleksi perusahaan multinasional."),
    4139: ("cara menghafal kosakata bahasa Inggris",
           "Cara menghafal kosakata bahasa Inggris untuk pemula: 7 metode terbukti, teknik spaced repetition, dan target harian realistis supaya kata baru nempel."),
    4059: ("cara belajar bahasa Inggris tanpa menunda",
           "Cara belajar bahasa Inggris tanpa menunda: 4 alasan klasik yang bikin orang nunda, cara membangun kebiasaan kecil, dan langkah mulai hari ini juga."),
    4051: ("bahasa Inggris untuk dewasa",
           "Bahasa Inggris untuk dewasa kini kebutuhan di dunia kerja. Simak manfaatnya untuk karier, tantangan belajar di usia dewasa, dan cara memilih kursusnya."),
    3928: ("kursus bahasa Inggris Surabaya Timur",
           "Kursus bahasa Inggris Surabaya Timur paling dekat untuk warga Mulyorejo, Sukolilo, dan Kalisari: LEIT Pakuwon Town Square, mulai Rp620rb per bulan."),
    3925: ("kursus bahasa Inggris Surabaya Barat",
           "Kursus bahasa Inggris Surabaya Barat di Waterplace Residence, seberang Pakuwon Mall: mulai Rp620rb per bulan, dekat Wiyung dan Citraland."),
    3904: ("les bahasa Inggris terdekat dari rumah",
           "Les bahasa Inggris terdekat dari rumah bikin kamu cepat mahir: 5 alasan soal konsistensi, biaya transport, dan energi belajar yang lebih hemat."),
    3903: ("tempat les bahasa Inggris terdekat di Surabaya",
           "Tempat les bahasa Inggris terdekat di Surabaya: 7 pilihan dibandingkan dari harga, jarak, dan kualitas, supaya kamu pilih yang murah tapi worth it."),
    3902: ("les bahasa Inggris terdekat Surabaya",
           "Les bahasa Inggris terdekat Surabaya kini ada 2 lokasi LEIT: Pakuwon Town Square untuk area timur dan Waterplace Residence untuk area barat, Rp620rb."),
    3866: ("CV bahasa Inggris wawancara kerja",
           "CV bahasa Inggris wawancara kerja sering gagal bukan karena skill: 7 kesalahan umum, dari noun phrase panjang sampai tell me about yourself."),
    3865: ("belajar bahasa Inggris era AI",
           "Belajar bahasa Inggris era AI tetap butuh skill manusia. Ini cara memakai ChatGPT dan Google Translate sebagai alat, bukan pengganti kemampuan Anda."),
    3864: ("soft skills era AI",
           "Soft skills era AI yang paling dicari: komunikasi, leadership, berpikir kritis, kolaborasi, dan adaptabilitas, plus cara LEIT membentuknya sejak dini."),
    3825: ("kursus bahasa Inggris paling terjangkau di Surabaya",
           "Kursus bahasa Inggris paling terjangkau di Surabaya mulai Rp620rb per bulan: kurikulum CEFR, speaking based, dan leadership based learning."),
    3827: ("Rekomendasi Kursus Bahasa Inggris Surabaya",
           "Rekomendasi kursus bahasa Inggris Surabaya dengan harga terjangkau: 7 pilihan lengkap dengan keunggulan, lokasi, dan perkiraan biaya per bulannya."),
}


def post(path, data):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
    r = urllib.request.Request(SITE + path, data=json.dumps(data).encode(), headers=h, method="POST")
    try:
        with urllib.request.urlopen(r, timeout=120) 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, md) in sorted(JOBS.items()):
    L = len(md)
    flag = "OK " if 120 <= L <= 158 and md.lower().startswith(fk.lower()) else "CEK"
    if flag == "CEK":
        bad += 1
    print(f"{flag} #{pid} len={L:>3} fk-start={'Y' if md.lower().startswith(fk.lower()) else 'N'} | {fk}")
    if apply_ and flag.strip() == "OK":
        st, res = post(f"/wp-json/wp/v2/posts/{pid}", {"meta": {"_yoast_wpseo_focuskw": fk, "_yoast_wpseo_metadesc": md}})
        saved_fk = res.get("meta", {}).get("_yoast_wpseo_focuskw") if isinstance(res, dict) else None
        saved_md = res.get("meta", {}).get("_yoast_wpseo_metadesc") if isinstance(res, dict) else None
        print(f"     POST {st} | tersimpan fk={'Y' if saved_fk else 'N'} md={'Y' if saved_md else 'N'}")
        ok += 1 if (st == 200 and saved_fk and saved_md) else 0

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