"""
Dissolve UWB-Wahlbezirke zu Abgeordnetenhauswahlkreisen (AWK).
Benötigt: pip install geopandas

Ausführen: python dissolve_awk.py
"""
import geopandas as gpd
from shapely.geometry import Polygon, MultiPolygon
from pathlib import Path

base = Path(__file__).parent.parent

# Einlesen
uwb = gpd.read_file(base / "wahlgeometrien.geojson")

# In UTM Zone 33N umprojizieren für metrisch korrekten Buffer
uwb = uwb.set_crs("EPSG:4326").to_crs("EPSG:25833")

# Geometrien reparieren + Buffer in Metern schließt kleine Lücken zwischen Bezirken
uwb["geometry"] = uwb["geometry"].buffer(1.5).buffer(-1.5)

# Dissolve nach AWK, BEZ beibehalten
awk = uwb.dissolve(by="AWK", as_index=False)[["AWK", "BEZ", "geometry"]]
awk = awk.sort_values("AWK").reset_index(drop=True)

# Geometrien vereinfachen (2 m Toleranz, preserve_topology vermeidet Überlappungen)
awk["geometry"] = awk["geometry"].simplify(2, preserve_topology=True)

# Zurück nach WGS84
awk = awk.to_crs("EPSG:4326")

# Löcher (innere Ringe) entfernen
def remove_holes(geom):
    if geom.geom_type == "Polygon":
        return Polygon(geom.exterior)
    elif geom.geom_type == "MultiPolygon":
        return MultiPolygon([Polygon(p.exterior) for p in geom.geoms])
    return geom

awk["geometry"] = awk["geometry"].apply(remove_holes)

# Speichern
out = base / "wahlkreise.geojson"
awk.to_file(out, driver="GeoJSON")

holes = sum(
    (len(g.interiors) if g.geom_type == "Polygon" else sum(len(p.interiors) for p in g.geoms))
    for g in awk.geometry
)
print(f"Gespeichert: {out}  ({len(awk)} Features, {holes} Löcher)")
