"""Configuration constants for the parliamentary explorer.

This module contains all constant definitions used across the explorer.
It is intentionally free of Streamlit and DuckDB dependencies.
"""

from __future__ import annotations

from typing import Dict

__all__ = [
    "PARTY_COLOURS",
    "SVD_THEMES",
    "KNOWN_MAJOR_PARTIES",
    "CURRENT_PARLIAMENT_PARTIES",
    "_PARTY_NORMALIZE",
    "CANONICAL_RIGHT",
    "CANONICAL_LEFT",
]

CANONICAL_RIGHT: frozenset[str] = frozenset(
    {
        "PVV",
        "FVD",
        "JA21",
        "SGP",
    }
)

CANONICAL_LEFT: frozenset[str] = frozenset(
    {
        "SP",
        "PvdA",
        "GL",
        "GroenLinks",
        "GroenLinks-PvdA",
        "DENK",
        "PvdD",
        "Volt",
    }
)

PARTY_COLOURS: Dict[str, str] = {
    "VVD": "#1E73BE",
    "PVV": "#002366",
    "D66": "#00A36C",
    "CDA": "#4CAF50",
    "SP": "#E53935",
    "PvdA": "#D32F2F",
    "GroenLinks": "#388E3C",
    "GroenLinks-PvdA": "#2E7D32",
    "CU": "#0288D1",
    "SGP": "#F4511E",
    "PvdD": "#43A047",
    "FVD": "#6A1B9A",
    "JA21": "#7B1FA2",
    "BBB": "#8D6E63",
    "NSC": "#FF8F00",
    "Nieuw Sociaal Contract": "#FF8F00",
    "DENK": "#00897B",
    "50PLUS": "#7E57C2",
    "Volt": "#572AB7",
    "ChristenUnie": "#0288D1",
    "Unknown": "#9E9E9E",
}

SVD_THEMES: dict[int, dict[str, str]] = {
    1: {
        "label": "Fiscaal-economisch beleid versus sociaal welzijn en internationale rechten",
        "explanation": (
            "Deze as scheidt fiscaal-economisch beleid van sociaal welzijn en internationale solidariteit. "
            "Aan de positieve kant staan moties over dijkvervanging, medische bijscholing, gaswinning op land, "
            "landbouwsubsidies en fiscale verlichting. "
            "Aan de negatieve kant staan moties over huurprijsbeheersing, boycot van defensiebedrijven, "
            "beëindiging van militaire verdragen, antipersoneelslandmijnen en zorgbuurthuizen. "
            "Deze as weerspiegelt de spanning tussen financieel-economische prioriteiten en sociaal-internationaal beleid."
        ),
        "positive_pole": "Fiscaal-economisch: dijkvervanging, landbouwsubsidies, gaswinning, fiscale verlichting",
        "negative_pole": "Sociaal welzijn en internationale rechten: huurbeheersing, defensieboycot, zorg, landmijnverbod",
        "flip": False,
    },
    2: {
        "label": "Nationalistische versus multilateralistische oriëntatie",
        "explanation": (
            "Deze as meet een onafhankelijke culturele dimensie: nationalistisch-populistisch "
            "tegenover kosmopolitisch-mainstream. Aan de positieve kant staan PVV en FVD. "
            "Aan de negatieve kant staan Volt, GroenLinks-PvdA, DENK en SP. "
            "Deze as is onafhankelijk van links-rechts (as 1) en scheidt partijen "
            "op hun houding tegenover nationale identiteit, EU-samenwerking en de "
            "etnisch-culturele dimensie."
        ),
        "positive_pole": "Nationalistisch/populistisch — PVV, FVD: nationale identiteit en soevereiniteit",
        "negative_pole": "Kosmopolitisch/mainstream — Volt, GL-PvdA, DENK, SP: EU en internationale samenwerking",
        "flip": False,
    },
    3: {
        "label": "Verzorgingsstaat versus defensie en nationale veiligheid",
        "explanation": (
            "Deze as weerspiegelt de spanning tussen staatsingrijpen en marktliberalisme, "
            "aangescherpt door de kabinetscrisis van 2025. Aan de positieve kant staan moties "
            "die bezuinigingen op zorg en het gemeentefonds willen terugdraaien, winstuitkeringen "
            "in de zorg verbieden en publieke controle over ziekenhuisfusies eisen. SP, PvdD, "
            "GroenLinks-PvdA stemmen hier gelijk — ondanks hun tegengestelde PC1-posities. "
            "Aan de negatieve kant staan moties "
            "over marktwerking in de zorg, fiscale bedrijfsopvolgingsfaciliteiten (VVD), "
            "doorgaan met besturen ondanks de kabinetscrisis (VVD/BBB) en defensie-"
            "uitgaven van 3,5% bbp."
        ),
        "positive_pole": "Pro-verzorgingsstaat: SP, PvdD, GroenLinks-PvdA (anti-bezuinigingen)",
        "negative_pole": "Marktliberaal en fiscaal conservatief: VVD, D66, CDA, SGP, BBB",
        "flip": True,
    },
    4: {
        "label": "Actieve internationale betrokkenheid versus terughoudendheid",
        "explanation": (
            "Deze as scheidt actieve internationale betrokkenheid van terughoudendheid of terugtrekking. "
            "Aan de positieve kant staan moties over bilaterale en Europese samenwerking: partnerschappen met Australië, "
            "actieve vaderbetrokkenheid, kennisuitwisseling en coördinatie via internationale gremia. "
            "Aan de negatieve kant staan moties over verlaten van de WHO, beperking van migratiesaldo, "
            "gezinsbeleid en asielrestricties. "
            "Deze as is indicatief — de spreiding van partijen is breed."
        ),
        "positive_pole": "Actieve internationale betrokkenheid: bilaterale samenwerking, kennisuitwisseling, multilaterale coördinatie",
        "negative_pole": "Terughoudendheid en restricties: WHO-verlating, migratielimieten, binnenlands gericht beleid",
        "flip": False,
    },
    5: {
        "label": "Pragmatische financiële ondersteuning versus progressieve individuele rechten",
        "explanation": (
            "Deze as scheidt pragmatische financiële en structurele ondersteuning van progressieve individuele rechten. "
            "Aan de positieve kant staan moties over een vrijgesteld minimumbudget voor infrastructurele werken, "
            "maatschappelijke diensttijd voor kwetsbare jongeren, verkorting van de WW alleen met concrete "
            "ondersteuningsmaatregelen, en vrijwaring van kindertoeslagen. "
            "Aan de negatieve kant staan moties over erkenning van meerouderschap, "
            "wettelijke kwaliteitseisen aan zwemlessen, een nationaal coördinator tegen buitenlandse beïnvloeding, "
            "en vastlegging van abortusrecht in het EU-Handvest. "
            "Deze as weerspiegelt de spanning tussen financiële prikkels en individuele rechtenbescherming."
        ),
        "positive_pole": "Pragmatische financiële ondersteuning: budgetvrijwaring, diensttijd, WW-hervorming, kindertoeslagen",
        "negative_pole": "Progressieve individuele rechten: meerouderschap, abortusrecht, zwemveiligheid, buitenlandse beïnvloeding",
        "flip": False,
    },
    6: {
        "label": "Fossiele brandstoffen en financiële prikkels versus klimaatbeleid en internationale rechten",
        "explanation": (
            "Deze as scheidt fossiele brandstoffen en financiële marktprikkels van klimaatbeleid en internationale rechten. "
            "Aan de positieve kant staan moties over lng-capaciteit als alternatief voor gaswinning, "
            "kernenergie als volwaardig onderdeel van energiebeleid, vermogenswinstbelasting en beperkte "
            "overheidsuitgaven. "
            "Aan de negatieve kant staan moties over het uitsluiten van de fossiele industrie van klimaatconferenties, "
            "veroordeling van aanvallen op Libanon, sancties tegen internationale conflicten, "
            "en structureel overleg met moslimgemeenschappen. "
            "Deze as weerspiegelt de spanning tussen economisch-fiscale prioriteiten en klimaat/internationale solidariteit."
        ),
        "positive_pole": "Fossiel en financieel: lng-capaciteit, kernenergie, vermogenswinstbelasting, bezuinigingen",
        "negative_pole": "Klimaat en internationale rechten: fossiele industrie uitsluiten, sancties, Libanon, gemeenschappen",
        "flip": False,
    },
    7: {
        "label": "Praktisch-bestuurlijk versus idealistisch-proceduraal",
        "explanation": (
            "Een residuele as die overwegend beleidsdossiers uit 2024 (vorige parlementaire "
            "periode) omvat. De scores zijn smal (max ~11 punten) en de partijcombinaties "
            "ideologisch divers — dit label is indicatief. Aan de positieve kant staan "
            "pragmatische bestuursmoties: een compleet kostenoverzicht van producten van eigen "
            "bodem, papieren schoolboeken voor basisvaardigheden, een invoeringstoets voor het "
            "minimumloon en de A2-snelwegplanning. ChristenUnie, Volt, DENK en SP scoren "
            "positief. Aan de negatieve kant staan meer ideologisch geladen moties: een "
            "landelijk stookverbod (PvdD), het strafbaar stellen van verbranding van religieuze "
            "geschriften (DENK), chroom-6 schadevergoedingen en tegenhouden van nieuwe "
            "gaswinning. GroenLinks-PvdA, VVD, FVD en JA21 scoren negatief."
        ),
        "positive_pole": "Praktisch-bestuurlijk: ChristenUnie, Volt, SGP, DENK, SP",
        "negative_pole": "Ideologisch-principieel: GroenLinks-PvdA, VVD, FVD, JA21",
        "flip": True,
    },
    8: {
        "label": "Europese defensiesamenwerking versus binnenlands sociaaleconomisch beleid",
        "explanation": (
            "Deze as scheidt Europese defensiesamenwerking van binnenlands sociaaleconomisch beleid. "
            "Aan de positieve kant staan moties over militaire mobiliteit in EU- en NAVO-verband, "
            "een Europees onderzoeksinstituut voor defensie, en concrete stappen voor 35% defensie-uitgaven. "
            "Aan de negatieve kant staan moties over toeslagenaffaire-herstel, ontslagrecht, "
            "coronastrategie en bestuurlijke instructieregels. "
            "Deze as is indicatief — de spreiding van partijen is breed en de thematische diversiteit is groot."
        ),
        "positive_pole": "Europese defensiesamenwerking: NAVO-militaire mobiliteit, Europees defensie-instituut, defensie-uitgaven",
        "negative_pole": "Binnenlands beleid: toeslagen, ontslagrecht, coronastrategie, administratieve lasten",
        "flip": False,
    },
    9: {
        "label": "Concreet-bestuurlijke versus systemische hervorming",
        "explanation": (
            "Deze as scheidt concreet-bestuurlijke oplossingen van systemische hervorming. "
            "Aan de positieve kant staan moties over naleving van financiële verhoudingswetten voor gemeenten, "
            "beperking van arbeidsmigratie, een nieuwe tandartsopleiding in Rotterdam, "
            "en oplossingen voor milieuproblemen op Bonaire. "
            "Aan de negatieve kant staan moties over een moratorium op geitenstallen, "
            "een verbod op gokadvertenties, gronden voor voorlopige hechtenis, "
            "een leegstandbelasting en end-to-end-encryptie. "
            "Deze as is indicatief — de scores zijn smal en ideologisch divers."
        ),
        "positive_pole": "Concreet-bestuurlijk: financiële verhoudingswet, arbeidsmigratie, tandartsopleiding, Bonaire",
        "negative_pole": "Systemische hervorming: geitenstallen-moratorium, gokverbod, leegstandbelasting, encryptie",
        "flip": False,
    },
    10: {
        "label": "Bescherming van burgers versus overheidsregulering",
        "explanation": (
            "Deze as scheidt bescherming van burgers van overheidsregulering en handhaving. "
            "Aan de positieve kant staan moties over minder tijdsintensieve schoolinspecties, "
            "het recht van toeslagenouders op hun persoonlijk dossier, behoud van tegemoetkomingen "
            "voor arbeidsongeschikten, integratie die geldt voor nieuwkomers (niet voor Nederlanders), "
            "en verlaging van de leeftijdsdrempel voor kindgesprekken. "
            "Aan de negatieve kant staan moties over een aangifteplicht voor scholen bij "
            "veiligheidsincidenten, rookverboden in auto's met kinderen, "
            "braakliggende landbouwgrond en verhoogd beloningsgeld voor tipgevers. "
            "Deze as is indicatief — de scores zijn smal en de partijcombinaties divers."
        ),
        "positive_pole": "Bescherming van burgers: minder inspecties, toegang tot dossiers, behoud toeslagen, kindleeftijd",
        "negative_pole": "Overheidsregulering: aangifteplicht scholen, rookverbod, braakliggende grond, tipgeversbeloning",
        "flip": True,
    },
}

KNOWN_MAJOR_PARTIES = [
    "VVD",
    "PVV",
    "D66",
    "GroenLinks-PvdA",
    "GroenLinks",
    "PvdA",
    "CDA",
    "SP",
    "NSC",
    "CU",
    "BBB",
]

CURRENT_PARLIAMENT_PARTIES: frozenset[str] = frozenset(
    {
        "PVV",
        "VVD",
        "NSC",
        "BBB",
        "D66",
        "GroenLinks-PvdA",
        "CDA",
        "SP",
        "ChristenUnie",
        "SGP",
        "Volt",
        "DENK",
        "PvdD",
        "JA21",
        "FVD",
    }
)

_PARTY_NORMALIZE: dict[str, str] = {
    "Nieuw Sociaal Contract": "NSC",
    "CU": "ChristenUnie",
    "GL": "GroenLinks-PvdA",
    "GroenLinks": "GroenLinks-PvdA",
    "PvdA": "GroenLinks-PvdA",
    "Gündoğan": "Volt",
    "Lid Keijzer": "BBB",
    "Groep Markuszower": "PVV",
}
