from fastapi import APIRouter
from fastapi.responses import JSONResponse
from shapely.wkb import loads as load_wkb
from shapely.geometry import mapping
import pymysql
import json

router = APIRouter()

# DB-Verbindungsfunktion
def get_conn():
    return pymysql.connect(
        host="localhost",
        user="wahl",
        password="Uy9n2FPQ7%pM^H3",  # ändern
        database="wahl",
        charset="utf8mb4",
        cursorclass=pymysql.cursors.DictCursor
    )

@router.get("/wahl/{jahr}")
def get_wahldaten(jahr: str):
    conn = get_conn()
    cur = conn.cursor()

    # Wahlen anhand Jahreszahl finden
    cur.execute("SELECT id FROM wahl WHERE bezeichnung LIKE %s", (f"%{jahr}%",))
    wahl = cur.fetchone()
    if not wahl:
        conn.close()
        return {}

    cur.execute("SELECT * FROM wahlergebnis WHERE wahl_id = %s", (wahl["id"],))
    ergebnisse = cur.fetchall()

    daten = {}
    for e in ergebnisse:
        wid = str(e["wahlbezirk_id"]).zfill(5)
        cur.execute("SELECT partei, stimmen FROM erststimme WHERE wahlergebnis_id = %s", (e["id"],))
        erst = {r["partei"]: r["stimmen"] for r in cur.fetchall()}

        cur.execute("SELECT partei, stimmen FROM zweitstimme WHERE wahlergebnis_id = %s", (e["id"],))
        zweit = {r["partei"]: r["stimmen"] for r in cur.fetchall()}

        daten[wid] = {
            "Wahlberechtigte": e["wahlberechtigte"],
            "Wählende": e["waehlende"],
            "Wahlbeteiligung": e["wahlbeteiligung"],
            "Erststimmen": erst,
            "Zweitstimmen": zweit
        }

    conn.close()
    return daten

@router.get("/wahlbezirke.geojson")
def wahlbezirke_geojson():
    conn = get_conn()
    cur = conn.cursor()
    cur.execute("SELECT * FROM wahlbezirk")
    daten = cur.fetchall()

    features = []
    for row in daten:
        geom = load_wkb(row["geom"], hex=True)
        geojson_geom = mapping(geom)
        feature = {
            "type": "Feature",
            "geometry": geojson_geom,
            "properties": {
                "id": row["id"],
                "UWB": row["uwb"],
                "WBZNR": row["bezirksnummer"]
            }
        }
        features.append(feature)

    conn.close()
    return JSONResponse({
        "type": "FeatureCollection",
        "features": features
    })

@router.get("/demografie")
def demografie_reinickendorf():
    conn = get_conn()
    cur = conn.cursor()
    cur.execute("SELECT * FROM demografie_lor_simple")
    daten = cur.fetchall()
    conn.close()
    return daten

@router.get("/lor.geojson")
def lor_geojson():
    conn = get_conn()
    cur = conn.cursor()
    cur.execute("SELECT * FROM lor_region")
    daten = cur.fetchall()
    conn.close()

    features = []
    for row in daten:
        geom = load_wkb(row["geom"], hex=True)
        geojson_geom = mapping(geom)
        features.append({
            "type": "Feature",
            "geometry": geojson_geom,
            "properties": {
                "RAUMID": row.get("raumid"),
                "NAME": row.get("name") or ""
            }
        })

    return {
        "type": "FeatureCollection",
        "features": features
    }

@router.get("/demografie/{raumid}")
def get_demografie_eintrag(raumid: str):
    conn = get_conn()
    cur = conn.cursor()
    cur.execute("""
        SELECT * FROM demografie_lor_simple
        WHERE raumid = %s
        ORDER BY jahr DESC
        LIMIT 1
    """, (raumid,))
    eintrag = cur.fetchone()
    conn.close()

    if not eintrag:
        return {}

    return {
        "raumid": eintrag["raumid"],
        "jahr": eintrag["jahr"],
        "einwohner": eintrag["einwohner"],
        "age_0_18": eintrag["age_0_18"],
        "age_18_65": eintrag["age_18_65"],
        "age_65_plus": eintrag["age_65_plus"],
        "ANT_AUSL": eintrag["ant_auslaender"]
    }
