#!/usr/bin/env python3
"""Otto Relevanz-Scorer. Setzt relevanz_breact je Index-Eintrag deterministisch.

BReact-Profil: österreichische KI-/Software-/Automatisierungs-/F&E-Firma (KMU).
Eligibility-Regel (aus README): AT direkt, EU direkt (Solo EIC / sonst Konsortium),
DE nur mit Betriebsstätte/als Partner, CH nur mit CH-Sitz/-Partner.
"""
import json, glob, re, collections

IDX = "/home/nk/hobo-godmode/otto/data/index"

# Profil-Keywords (lowercase, Substring-Match auf name + themen + traeger)
STRONG = ["künstliche intelligenz", "artificial intelligence", " ki ", "ki-", "ki ", "(ki)",
          " ai ", "ai-", "machine learning", "deep tech", "deeptech", "software", "digitalisier",
          "digitale", "digital ", "automatisier", "automation", "data ", "daten", "big data",
          "cloud", "plattform", "platform", "chatbot", "sprachtechnologie", "language tech",
          "cyber", "iot", "ikt", "ict", "robotik", "robotics", "algorithm"]
MEDIUM = ["innovation", "f&e", "forschung", "research", "technologie", "technology", "r&i",
          "r&d", "entwicklung", "development", "startup", "start-up", "gründ", "wachstum",
          "scale-up", "produktentwicklung", "wettbewerbsfähigkeit", "competitiveness",
          "transformation", "modernisier", "investition"]
# klar fachfremd -> drückt auf niedrig (nur wenn kein STRONG-Treffer)
OFFSECTOR = ["landwirt", "agrar", "agri", "fisch", "forst", "wein", "tourism", "hotel",
             "gastronom", "denkmal", "kultur", "film", "theater", "musik", "kunst",
             "wohnung", "wohnbau", "immobilie", "städtebau", "sanierung von gebäud",
             "pflege", "kranken", "soziale", "sport", "kirche", "naturschutz", "wald",
             "ernten", "tierhaltung", "weinbau", "obst", "garten"]

def has(text, kws): return any(k in text for k in kws)

def score(e):
    blob = (e.get("name","") + " | " + " ".join(e.get("themen",[])) + " | " +
            e.get("traeger","")).lower()
    j = e.get("jurisdiktion","")
    strong = has(blob, STRONG)
    medium = has(blob, MEDIUM)
    off    = has(blob, OFFSECTOR)

    # Themen-Fit (vor Eligibility)
    if strong:        fit = "hoch"
    elif medium and not off: fit = "mittel"
    elif off:         fit = "niedrig"
    else:             fit = "mittel" if (e.get("themen") or j=="EU") else "niedrig"

    # Eligibility-Dämpfung: DE/CH nur mit Präsenz -> max. mittel
    if j in ("DE","CH") and fit == "hoch":
        fit = "mittel"   # thematisch top, aber Zugang nur via Präsenz/Partner
    return fit

def main():
    counts = collections.Counter()
    shortlist = []
    for f in glob.glob(f"{IDX}/*.jsonl"):
        out=[]
        for line in open(f):
            line=line.strip()
            if not line: continue
            e=json.loads(line)
            r=score(e)
            e["relevanz_breact"]=r
            counts[(e["jurisdiktion"], r)]+=1
            if r=="hoch": shortlist.append((e["jurisdiktion"], e["name"], e["source_catalog"]))
            out.append(json.dumps(e, ensure_ascii=False))
        open(f,"w").write("\n".join(out)+"\n")

    print("=== relevanz_breact je Rechtsraum ===")
    for j in ["AT","EU","DE","CH"]:
        h=counts[(j,"hoch")]; m=counts[(j,"mittel")]; n=counts[(j,"niedrig")]
        print(f"  {j}: hoch={h:4d}  mittel={m:4d}  niedrig={n:4d}  (Σ {h+m+n})")
    th=sum(v for (j,r),v in counts.items() if r=="hoch")
    tm=sum(v for (j,r),v in counts.items() if r=="mittel")
    print(f"\nGESAMT hoch={th}  mittel={tm}  -> Shortlist (hoch): {len(shortlist)}")

if __name__=="__main__":
    main()
