#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Validasi + publish artikel gap studiosoft.id (SEO_Playbook.md).

Pakai:
  python3 publish_ss_artikel_gap.py cek       # validasi saja
  python3 publish_ss_artikel_gap.py publish   # publish + verifikasi baca balik
"""
import base64, json, re, sys, urllib.request, urllib.error
import ss_artikel_gap_20261005_a as A
import ss_artikel_gap_20261005_b as B

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()

ARTIKEL = [A.ART1, A.ART2, B.ART3, B.ART4, B.ART5]
KATEGORI = {"jasa-seo-surabaya-paket-harga": [330, 26],
            "tools-analisis-kompetitor-media-sosial": [330, 26],
            "digital-agency-surabaya-vs-freelancer": [26, 330],
            "branding-agency-surabaya-proses-hasil-kerja": [26],
            "jasa-maintenance-wordpress-pekerjaan-bulanan": [330, 26]}
CJK = re.compile(r"[\u3000-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]")


def teks_polos(html):
    t = re.sub(r"<!--.*?-->", " ", html, flags=re.S)
    t = re.sub(r"<script.*?</script>", " ", t, flags=re.S | re.I)
    t = re.sub(r"<[^>]+>", " ", t)
    return re.sub(r"\s+", " ", t).strip()


def validasi(a):
    m = []
    plain = teks_polos(a["isi"])
    kata = len(plain.split())
    kp = a["keyphrase"].lower()
    if kata < 1000:
        m.append(f"kata={kata} (<1000)")
    if len(a["title"]) > 55:
        m.append(f"judul={len(a['title'])}")
    if not (120 <= len(a["meta"]) <= 158):
        m.append(f"meta={len(a['meta'])}")
    if not a["meta"].lower().startswith(kp[:22]):
        m.append("meta tidak mulai dengan keyphrase")
    if kp not in plain[:700].lower():
        m.append("keyphrase tidak di paragraf 1")
    if a["isi"].lower().count(kp) < 3:
        m.append(f"keyphrase hanya {a['isi'].lower().count(kp)}x")
    if f"<h2>" not in a["isi"]:
        m.append("tanpa H2")
    if not re.search(r'type="application/ld\+json"', a["isi"]):
        m.append("tanpa FAQ schema")
    if "FAQ" not in a["isi"]:
        m.append("tanpa bagian FAQ")
    internal = len(re.findall(r'href="https://studiosoft\.id/', a["isi"]))
    eksternal = len(re.findall(r'href="https?://(?!studiosoft\.id)[^"]+"', a["isi"]))
    if internal < 2:
        m.append(f"internal link={internal}")
    if eksternal < 1:
        m.append("tanpa outbound link")
    if "wa.me/6281935000624" not in a["isi"]:
        m.append("tanpa tombol WA")
    if CJK.search(a["isi"]):
        m.append("ada CJK")
    if re.search(r'<h1', a["isi"], re.I):
        m.append("ada H1 di body")
    return kata, m


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


def tag_ids(names):
    out = []
    for n in names:
        st, d = api(f"/wp-json/wp/v2/tags?search={urllib.parse.quote(n)}&per_page=5")
        tem = None
        if isinstance(d, list):
            for t in d:
                if t["name"].lower() == n.lower():
                    tem = t["id"]
                    break
        if tem is None:
            st2, d2 = api("/wp-json/wp/v2/tags", "POST", {"name": n})
            if isinstance(d2, dict) and d2.get("id"):
                tem = d2["id"]
        if tem:
            out.append(tem)
    return out


import urllib.parse


def main():
    aksi = sys.argv[1] if len(sys.argv) > 1 else "cek"
    print(f"{'kata':>5} {'slug':<48} status")
    for a in ARTIKEL:
        kata, m = validasi(a)
        print(f"{kata:>5} {a['slug']:<48} {'OK' if not m else 'MASALAH: ' + '; '.join(m)}")
    if aksi != "publish":
        return

    hasil = []
    for a in ARTIKEL:
        kata, m = validasi(a)
        if m:
            print(f"SKIP {a['slug']}: {m}")
            continue
        st, cek = api(f"/wp-json/wp/v2/posts?slug={a['slug']}&status=any&_fields=id,slug,status")
        if isinstance(cek, list) and cek:
            print(f"SUDAH ADA {a['slug']} id={cek[0]['id']} status={cek[0]['status']}")
            hasil.append({"slug": a["slug"], "id": cek[0]["id"], "status": cek[0]["status"], "aksi": "sudah ada"})
            continue
        tids = tag_ids(a["tags"])
        body = {"title": a["title"], "slug": a["slug"], "content": a["isi"],
                "excerpt": a["meta"], "status": "publish",
                "categories": KATEGORI.get(a["slug"], [330]),
                "meta": {"_yoast_wpseo_focuskw": a["keyphrase"],
                         "_yoast_wpseo_title": a["title"],
                         "_yoast_wpseo_metadesc": a["meta"]}}
        if tids:
            body["tags"] = tids
        st, res = api("/wp-json/wp/v2/posts", "POST", body)
        if isinstance(res, dict) and res.get("id"):
            print(f"PUBLISH ok http={st} id={res['id']} status={res.get('status')} link={res.get('link')}")
            hasil.append({"slug": a["slug"], "id": res["id"], "link": res.get("link"),
                          "status": res.get("status"), "kata": kata, "tag_ids": tids, "aksi": "publish"})
        else:
            print(f"GAGAL {a['slug']} http={st} -> {str(res)[:300]}")
            hasil.append({"slug": a["slug"], "aksi": "gagal", "http": st, "err": str(res)[:300]})
    json.dump(hasil, open("ss_artikel_gap_hasil.json", "w"), ensure_ascii=False, indent=1)
    print("-> ss_artikel_gap_hasil.json")


if __name__ == "__main__":
    main()
