#!/usr/bin/env python3
"""Diagnosa SEO Yasmanatura: artikel nol impresi, klaster terbit serentak, link internal, FAQ, panjang."""
import base64, html, json, os, re, time, urllib.request, collections
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build

S = "https://yasmanatura.co.id"
AUTH = base64.b64encode(b"bambangbot:LFp4 LXBh kMYG 84qC 2DDc 5bLc").decode()
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)
a, b = (e - timedelta(days=89)).isoformat(), e.isoformat()
imp = {}
for r in gsc.searchanalytics().query(siteUrl=S + "/", body={"startDate": a, "endDate": b, "dimensions": ["page"],
                                                            "rowLimit": 2000}).execute().get("rows", []):
    imp[r["keys"][0].rstrip("/")] = int(r["impressions"])


def api(path):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    r = urllib.request.Request(S + path, headers=h)
    err = None
    for _ in range(4):
        try:
            with urllib.request.urlopen(r, timeout=240) as x:
                return json.loads(x.read())
        except Exception as ex:
            err = ex; time.sleep(4)
    print("  gagal:", str(err)[:60]); return []


posts, page = [], 1
while True:
    d = api(f"/wp-json/wp/v2/posts?per_page=100&page={page}&context=edit&_fields=id,link,slug,title,date,content")
    posts += d
    if len(d) < 100:
        break
    page += 1
print(f"total post Yasma: {len(posts)} | halaman punya impresi (90d): {len(imp)}")

nol, tipis, tanpa_faq, tanpa_link, pendek = [], 0, 0, 0, 0
for p in posts:
    raw = p["content"]["raw"] if isinstance(p["content"], dict) else ""
    kata = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
    if p["link"].rstrip("/") not in imp:
        nol.append({"id": p["id"], "judul": html.unescape(p["title"]["rendered"]), "tgl": p["date"][:10], "kata": kata})
    if kata < 1000:
        pendek += 1
    if "FAQPage" not in raw:
        tanpa_faq += 1
    if not re.search(r'href="https://yasmanatura\.co\.id/', raw):
        tanpa_link += 1

print(f"  artikel NOL impresi (90d) : {len(nol)}")
print(f"  artikel < 1.000 kata      : {pendek}")
print(f"  tanpa FAQ + schema        : {tanpa_faq}")
print(f"  tanpa link internal       : {tanpa_link}")

print("\n=== terbit di hari yang sama (>=4 artikel/hari) ===")
per_hari = collections.Counter(p["date"][:10] for p in posts)
for tgl, n in per_hari.most_common(6):
    if n >= 4:
        contoh = [html.unescape(x["title"]["rendered"])[:52] for x in posts if x["date"][:10] == tgl][:3]
        print(f"  {tgl}: {n} artikel | {contoh}")

print("\n=== 15 artikel nol impresi (paling baru) ===")
for x in sorted(nol, key=lambda y: y["tgl"], reverse=True)[:15]:
    print(f"  {x['tgl']} | {x['kata']:>4} kata | #{x['id']:>5} | {x['judul'][:60]}")

print("\n=== kata kunci non-brand dengan impresi terbesar (yang belum menang) ===")
rows = gsc.searchanalytics().query(siteUrl=S + "/", body={"startDate": a, "endDate": b, "dimensions": ["query"],
                                                          "rowLimit": 5000}).execute().get("rows", [])
BR = ("yasma", "yasmanatura")
non = [r for r in rows if not any(x in r["keys"][0].lower() for x in BR)]
for r in sorted(non, key=lambda x: -x["impressions"])[:14]:
    tanda = "❗" if r["position"] > 15 else "✅"
    print(f"  {tanda} {int(r['impressions']):>5} imp | {int(r['clicks'])} klik | pos {r['position']:>5.1f} | {r['keys'][0]}")
json.dump(nol, open("ys_nol_impresi.json", "w"), indent=1, ensure_ascii=False)
