# Telling runde 2: begge trekninger, to kolonner (omtale/sitering), stoyterskel >=2 av 4 flater
# Kilde: normalisert-trekk1.json + normalisert-trekk2.json (telling fra raatekst godtas ikke)
import json, re
from collections import defaultdict

BASE = r"C:\Users\niels\Documents\Claude\Projects\EffektivMarketing\Klienter\effektivmarketing\data\leaderboard-runde2"
T1 = json.load(open(BASE + r"\trekk1\normalisert-trekk1.json", encoding="utf-8"))
T2 = json.load(open(BASE + r"\trekk2\normalisert-trekk2.json", encoding="utf-8"))

def flate_kort(f):
    f = f.lower()
    if "chatgpt" in f: return "ChatGPT"
    if "copilot" in f: return "Copilot"
    if "gemini" in f: return "Gemini"
    return "AIO"

# Lista-byraaer (9 endelige + M51 anbefalt inn, merket) — aliaser og domener
AKTORER = {
    "Synlighet AS":  {"alias": ["synlighet as", "synlighet"], "dom": ["synlighet.no"]},
    "CitationLab":   {"alias": ["citationlab"], "dom": ["citationlab.no", "citationlab.se"]},
    "Fullstakk":     {"alias": ["fullstakk"], "dom": ["fullstakk.no"]},
    "Search Planet": {"alias": ["search planet", "searchplanet"], "dom": ["searchplanet.no"]},
    "Intent SEO":    {"alias": ["intent seo", "intentseo"], "dom": ["intentseo.no"]},
    "Mediseo":       {"alias": ["mediseo"], "dom": ["mediseo.no"]},
    "Medcom":        {"alias": ["medcom"], "dom": ["medcom.no"]},
    "Bonzer":        {"alias": ["bonzer"], "dom": ["bonzer.no", "bonzer.dk"]},
    "SalesUp":       {"alias": ["salesup"], "dom": ["salesup.no"]},
    "M51 (anbefalt inn)": {"alias": ["m51"], "dom": ["m51.no"]},
    "Wud (anbefalt inn)": {"alias": ["wud"], "dom": ["wud.no"]},
    "Aktuell Media (anbefalt inn)": {"alias": ["aktuell media"], "dom": ["aktuellmedia.no"]},
    "Sikte AI (anbefalt inn)": {"alias": ["sikte"], "dom": ["sikte.ai"]},
    "Skar Digital (anbefalt inn)": {"alias": ["skar digital"], "dom": ["skardigital.no"]},
}
EM = {"alias": ["effektivmarketing", "effektiv marketing"], "dom": ["effektivmarketing.no"]}

def normnavn(n):
    return n.lower().strip()

def tell(svarliste):
    # per aktor: omtale-flater, sitering-flater, omtale-antall, sitering-antall, treffliste
    res = {a: {"om_flater": set(), "sit_flater": set(), "om_n": 0, "sit_n": 0, "hvor": []} for a in AKTORER}
    res["_EM"] = {"om_flater": set(), "sit_flater": set(), "om_n": 0, "sit_n": 0, "hvor": []}
    andre_omtale = defaultdict(lambda: {"flater": set(), "n": 0})
    andre_sitering = defaultdict(lambda: {"flater": set(), "n": 0})

    for s in svarliste:
        fl = flate_kort(s["flate"])
        omtalte = [normnavn(o["navn"]) for o in s.get("omtalte", [])]
        siterte = [d["domene"].lower() for d in s.get("siterte", [])]
        tr = s.get("_trekning")
        sid = s["sporsmal_id"]
        for akt, spec in list(AKTORER.items()) + [("_EM", EM)]:
            om = any(any(al in o for al in spec["alias"]) for o in omtalte)
            sit = any(any(dm in d for dm in spec["dom"]) for d in siterte)
            if om:
                res[akt]["om_flater"].add(fl); res[akt]["om_n"] += 1
                res[akt]["hvor"].append(f"omtale {fl} {sid} (trekk {tr})")
            if sit:
                res[akt]["sit_flater"].add(fl); res[akt]["sit_n"] += 1
                res[akt]["hvor"].append(f"sitering {fl} {sid} (trekk {tr})")
        # utenfor-lista-telling (funn-seksjonen)
        for o in s.get("omtalte", []):
            n = o["navn"]
            if not any(any(al in normnavn(n) for al in spec["alias"]) for spec in AKTORER.values()) \
               and not any(al in normnavn(n) for al in EM["alias"]):
                andre_omtale[n]["flater"].add(fl); andre_omtale[n]["n"] += 1
        for d in s.get("siterte", []):
            dom = d["domene"].lower()
            if not any(any(dm in dom for dm in spec["dom"]) for spec in AKTORER.values()) \
               and not any(dm in dom for dm in EM["dom"]):
                andre_sitering[dom]["flater"].add(fl); andre_sitering[dom]["n"] += 1
    return res, andre_omtale, andre_sitering

alle = []
for s in T1["svar"]:
    s["_trekning"] = 1; alle.append(s)
for s in T2["svar"]:
    s["_trekning"] = 2; alle.append(s)

res, andre_om, andre_sit = tell(alle)

print("=== LISTA-BYRAAENE (40 svar: 2 trekninger x 4 flater x 5 sporsmaal) ===")
print(f"{'Aktor':22} {'Omtale':>7} {'O-flater':>9} {'Sitering':>9} {'S-flater':>9}  Terskel(>=2 flater)")
for akt, r in res.items():
    if akt == "_EM":
        continue
    of, sf = len(r["om_flater"]), len(r["sit_flater"])
    terskel = "SYNLIG (omtale)" if of >= 2 else ("under terskel" if r["om_n"] or r["sit_n"] else "0 treff")
    if sf >= 2:
        terskel += " + SYNLIG (sitering)"
    print(f"{akt:22} {r['om_n']:>7} {of:>9} {r['sit_n']:>9} {sf:>9}  {terskel}")
    for h in r["hvor"]:
        print(f"    - {h}")

r = res["_EM"]
print()
print("=== EM (utgivererklaering — ALDRI i rangeringen) ===")
print(f"Omtale: {r['om_n']} | omtale-flater: {sorted(r['om_flater'])} | Sitering: {r['sit_n']} | sitering-flater: {sorted(r['sit_flater'])}")
for h in r["hvor"]:
    print(f"    - {h}")

print()
print("=== UTENFOR LISTA — omtale >=3 svar (funn-seksjonen, rangeres ikke) ===")
for n, d in sorted(andre_om.items(), key=lambda kv: -kv[1]["n"]):
    if d["n"] >= 3:
        print(f"  {n:32} {d['n']:>2} omtaler, flater: {sorted(d['flater'])}")

print()
print("=== UTENFOR LISTA — sitering >=2 svar (kilde-domener) ===")
for n, d in sorted(andre_sit.items(), key=lambda kv: -kv[1]["n"]):
    if d["n"] >= 2:
        print(f"  {n:32} {d['n']:>2} siteringer, flater: {sorted(d['flater'])}")
