#!/usr/bin/env python3
"""Petakan klaster minuman serbuk Yasma: tanggal, panjang, impresi, peran kandidat."""
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"]), int(r["clicks"]), r["position"])


def api(path):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    r = urllib.request.Request(S + path, headers=h)
    for _ in range(4):
        try:
            with urllib.request.urlopen(r, timeout=240) as x:
                return json.loads(x.read())
        except Exception:
            time.sleep(4)
    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

serbuk = []
for p in posts:
    teks = (p["slug"] + " " + p["title"]["rendered"]).lower()
    if "serbuk" not in teks:
        continue
    raw = p["content"]["raw"]
    kata = len(html.unescape(re.sub(r"<[^>]+>", " ", raw)).split())
    i, k, pos = imp.get(p["link"].rstrip("/"), (0, 0, 0))
    serbuk.append({"id": p["id"], "tgl": p["date"][:10], "kata": kata, "imp": i, "klik": k, "pos": pos,
                   "judul": html.unescape(p["title"]["rendered"]), "link": p["link"],
                   "faq": "FAQPage" in raw})
print(f"artikel klaster 'serbuk': {len(serbuk)}\n")
print(f"{'id':>6} {'tgl':<11} {'kata':>5} {'imp':>5} {'klik':>4} {'pos':>5} {'FAQ':<4} judul")
for x in sorted(serbuk, key=lambda y: -y["imp"]):
    print(f"{x['id']:>6} {x['tgl']:<11} {x['kata']:>5} {x['imp']:>5} {x['klik']:>4} {x['pos']:>5.1f} "
          f"{'ada' if x['faq'] else '-':<4} {x['judul'][:56]}")
print("\nsebaran tanggal terbit:")
for tgl, n in collections.Counter(x["tgl"] for x in serbuk).most_common(6):
    print(f"  {tgl}: {n} artikel")
print(f"\nyang punya impresi: {sum(1 for x in serbuk if x['imp']>0)} | nol impresi: {sum(1 for x in serbuk if x['imp']==0)}")
json.dump(serbuk, open("ys_klaster_serbuk.json", "w"), indent=1, ensure_ascii=False)
