"""Wahlperioden-Helper für die Auswertungen. Maps a Drucksache-Datum + Bundesland auf eine Wahlperioden-Kennung. Single Source of Truth ist ``BUNDESLAENDER[bl].wahlperiode_start`` — alles vor diesem Datum gehört zur Vorgänger-WP, alles ab dem Datum zur aktuellen. Granularität: pro Bundesland kennen wir genau zwei WP — die laufende und die direkt davor. Das reicht für die Aggregations-Sicht (#58), denn der gesamte Antragsbestand stammt aus den letzten 5–10 Jahren. Sollte später eine echte Multi-WP-Historie nötig werden, ist der Erweiterungspunkt ``_wp_calendar`` als Liste von ``(start, ende, wp_id)``-Tupeln pro BL. """ from __future__ import annotations from typing import Optional from .bundeslaender import BUNDESLAENDER def wahlperiode_for(datum: str, bundesland: str) -> Optional[str]: """Liefert die Wahlperioden-Kennung für ein Datum + Bundesland. Format der Kennung: ``"-WP"``, z.B. ``"NRW-WP18"``, ``"MV-WP7"`` (Vorgänger-WP). Returns ``None`` wenn das Bundesland unbekannt oder das Datum nicht parsbar ist. >>> wahlperiode_for("2026-03-18", "MV") 'MV-WP8' >>> wahlperiode_for("2020-01-01", "MV") 'MV-WP7' """ bl = BUNDESLAENDER.get(bundesland) if bl is None: return None if not datum: return f"{bundesland}-WP{bl.wahlperiode}" # default: aktuelle WP # ISO-Datum ist lexikographisch vergleichbar — keine datetime-Parsing # nötig, solange das Format YYYY-MM-DD eingehalten wird. if datum >= bl.wahlperiode_start: return f"{bundesland}-WP{bl.wahlperiode}" return f"{bundesland}-WP{bl.wahlperiode - 1}" def all_wahlperioden() -> list[str]: """Liste aller bekannten Wahlperioden-Kennungen (aktuelle + Vorgänger pro Bundesland). Nützlich für UI-Filter-Dropdowns.""" out: list[str] = [] for code, bl in BUNDESLAENDER.items(): out.append(f"{code}-WP{bl.wahlperiode}") out.append(f"{code}-WP{bl.wahlperiode - 1}") return out