#!/usr/bin/env python3
"""Riset kata kunci TSC pakai Semrush (basis data Indonesia): volume, tingkat kesulitan, CPC."""
import json, time, urllib.error, urllib.parse, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
KEY = json.load(open(f"{WS}/.semrush_tsc_token.json"))["token"]
UA = {"User-Agent": "Mozilla/5.0"}
BASIS = "id"


def panggil(param):
    url = "https://api.semrush.com/?" + urllib.parse.urlencode({**param, "key": KEY})
    try:
        with urllib.request.urlopen(urllib.request.Request(url, headers=UA), timeout=60) as x:
            return x.read().decode("utf-8", "replace")
    except urllib.error.HTTPError as e:
        return f"__ERROR__ {e.code} {e.read().decode('utf-8', 'replace')[:90]}"
    except Exception as e:
        return f"__ERROR__ {str(e)[:60]}"


def baca(t):
    """Ubah keluaran bertitik-koma Semrush jadi daftar kamus."""
    if t.startswith("__ERROR__"):
        return [], t
    baris = t.strip().splitlines()
    if not baris:
        return [], "kosong"
    kepala = baris[0].split(";")
    hasil = []
    for b in baris[1:]:
        bagian = b.split(";")
        if len(bagian) != len(kepala):
            continue
        hasil.append(dict(zip(kepala, bagian)))
    return hasil, None


print("=== uji kunci dulu ===")
d, err = baca(panggil({"type": "phrase_this", "phrase": "dokter kulit sidoarjo", "database": BASIS}))
print("   phrase_this:", err or json.dumps(d, ensure_ascii=False)[:160])

SEED = ["dokter kulit", "klinik kecantikan", "klinik kulit", "dokter spesialis kulit"]
GEO = ("sidoarjo", "krian", "surabaya", "terdekat", "jawa timur")

kumpul = {}
for s in SEED:
    d, err = baca(panggil({"type": "phrase_related", "phrase": s, "database": BASIS,
                           "export_columns": "Ph,Nq,Cp,Kd", "display_limit": "100"}))
    print(f"   related «{s}»: {err or str(len(d)) + ' kueri'}")
    for r in d:
        kw = r["Keyword"].lower()
        if any(g in kw for g in GEO) or len(kw.split()) <= 3:
            kumpul[kw] = r
    time.sleep(0.4)

print(f"\n=== tahap 2: volume untuk {len(kumpul)} kandidat ===")
daftar = sorted(kumpul)
akhir = {}
for i in range(0, len(daftar), 60):
    blok = daftar[i:i + 60]
    d, err = baca(panggil({"type": "phrase_these", "phrase": ";".join(blok), "database": BASIS,
                           "export_columns": "Ph,Nq,Cp,Kd"}))
    if err:
        print("   blok gagal:", err)
        continue
    for r in d:
        akhir[r["Keyword"].lower()] = r
    time.sleep(0.4)

urut = sorted(akhir.values(), key=lambda r: -int(r.get("Search Volume", 0) or 0))
print(f"   terkumpul: {len(urut)} kueri\n")
print(f"{'kata kunci':<44}{'volume':>8}{'kesulitan':>11}{'CPC':>8}")
for r in urut[:45]:
    print(f"{r['Keyword'][:43]:<44}{r.get('Search Volume', '-'):>8}{r.get('Keyword Difficulty', '-'):>11}{r.get('CPC', '-'):>8}")

json.dump(urut, open(f"{WS}/drafts/tsc_riset_kata_kunci_semrush.json", "w"), ensure_ascii=False, indent=1)
print(f"\n→ drafts/tsc_riset_kata_kunci_semrush.json")
