#!/usr/bin/env python3
"""Langkah 2: tambah tautan internal dari artikel relevan ke halaman uang #3770.
Sumber dipilih: judul relevan + punya impresi 90 hari. Idempoten. Dry run default."""
import base64, html, json, os, re, sys, time, urllib.request, urllib.error
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
TARGET = "https://studiosoft.id/jasa-pembuatan-website-profesional-untuk-usaha-jasa-di-surabaya/"
ANCHOR = "jasa pembuatan website surabaya"
MAKS = 25

creds = service_account.Credentials.from_service_account_file(
    os.path.expanduser("~/.hermes/gsc_service_account.json"),
    scopes=["https://www.googleapis.com/auth/webmasters.readonly"])
gsc = build("webmasters", "v3", credentials=creds, cache_discovery=False)
e = date.today() - timedelta(days=2)
S90, END = (e - timedelta(days=89)).isoformat(), e.isoformat()
imp = {}
for r in gsc.searchanalytics().query(siteUrl=S + "/", body={"startDate": S90, "endDate": END,
                                                           "dimensions": ["page"], "rowLimit": 500}).execute().get("rows", []):
    imp[r["keys"][0].rstrip("/")] = int(r["impressions"])


def api(path, data=None):
    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(S + path, data=body, headers=h, method="POST" if data else "GET")
    try:
        with urllib.request.urlopen(r, timeout=200) as x:
            return x.status, json.loads(x.read())
    except urllib.error.HTTPError as ex:
        return ex.code, ex.read().decode()[:200]


posts, page = [], 1
while True:
    st, d = api(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit&_fields=id,slug,title,content,link")
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"artikel diperiksa: {len(posts)}")

RELEVAN = ("website", "web ", "landing page", "wordpress", "umkm", "digital marketing", "seo", "leads",
           "konversi", "klinik", "bengkel", "google maps", "bisnis online", "google")
kandidat = []
for p in posts:
    judul = html.unescape(p["title"]["rendered"])
    raw = p["content"]["raw"]
    if TARGET in raw or p["link"].rstrip("/") == TARGET.rstrip("/"):
        continue
    if not any(k in judul.lower() for k in RELEVAN):
        continue
    kandidat.append({"id": p["id"], "judul": judul, "imp": imp.get(p["link"].rstrip("/"), 0),
                     "kata": len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())})

kandidat.sort(key=lambda x: -x["imp"])
pilih = [k for k in kandidat if k["imp"] > 0][:MAKS]
if len(pilih) < MAKS:
    pilih += [k for k in kandidat if k["imp"] == 0][:MAKS - len(pilih)]
print(f"\nartikel yang akan ditautkan ({len(pilih)}), diurutkan berdasarkan impresi 90 hari:")
for k in pilih:
    print(f"   {k['imp']:>5} imp | {k['kata']:>5} kata | #{k['id']} {k['judul'][:64]}")

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

ok = gagal = 0
for k in pilih:
    st, p = api(f"/wp-json/wp/v2/posts/{k['id']}?context=edit&_fields=content")
    raw = p["content"]["raw"]
    if TARGET in raw:
        print(f"  #{k['id']} sudah ada tautan — skip"); continue
    baris = f'\n<p><strong>Baca juga:</strong> <a href="{TARGET}">{ANCHOR}</a> — untuk bisnis yang butuh website siap mendatangkan pelanggan.</p>\n'
    m = re.search(r"\n<h2[^>]*>\s*(FAQ|Kesimpulan)", raw, re.I)
    baru = (raw[:m.start()] + baris + raw[m.start():]) if m else (raw.rstrip() + "\n" + baris)
    st2, _ = api(f"/wp-json/wp/v2/posts/{k['id']}", {"content": baru})
    _, chk = api(f"/wp-json/wp/v2/posts/{k['id']}?context=edit&_fields=content")
    jadi = TARGET in chk["content"]["raw"]
    print(f"  #{k['id']} POST {st2} | tautan {'masuk' if jadi else 'GAGAL'} | {k['judul'][:50]}")
    ok += 1 if jadi else 0
    gagal += 0 if jadi else 1
    time.sleep(0.5)
print(f"\nselesai: {ok} berhasil | {gagal} gagal")
