"""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": "Economische sectorbelangen versus sociale welvaart",
        "explanation": (
            "Deze as scheidt rechts kabinetsbeleid van links oppositiebeleid. "
            "Aan de positieve kant staan PVV, NSC, SGP en BBB. "
            "Aan de negatieve kant staan PvdD, GroenLinks-PvdA en DENK. "
            "Deze as weerspiegelt de klassieke links-rechts verdeling op economisch en migratiebeleid."
        ),
        "positive_pole": "Rechts: PVV, NSC, SGP, BBB — kabinetsbeleid, defensie en restricties",
        "negative_pole": "Links: PvdD, GroenLinks-PvdA, DENK — oppositie, zorg en multilateraal",
        "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": "Internationale instituties en multilateralisme versus nationale soevereiniteit",
        "explanation": (
            "Een residuele as met een brede spreiding van partijen. "
            "Aan de negatieve kant staan moties waar NSC en BBB sterk op scoren. "
            "Aan de positieve kant staan moties waar D66, CDA en JA21 sterk op scoren. "
            "FVD en DENK scoren rond het midden — deze as scheidt hen niet van de rest. "
            "Dit is geen klassieke links-rechts verdeling maar een mengeling van "
            "thematische posities — het label is indicatief."
        ),
        "positive_pole": "D66, CDA, JA21 — moties met brede steun",
        "negative_pole": "NSC, BBB — moties met andere focus",
        "flip": False,
    },
    5: {
        "label": "Gemeenschapszin versus individuele rechten",
        "explanation": (
            "Deze as scheidt christelijk-sociale partijen van progressieve partijen op het "
            "vlak van gemeenschapswaarden. Aan de positieve kant staan moties over "
            "schuldhulpverlening via vrijwilligersorganisaties, maatschappelijke "
            "diensttijd voor jongeren, gastouderopvang en financiële prikkels voor scholieren. "
            "ChristenUnie, SGP, CDA en NSC voeren hier de toon; ook D66 en FVD scoren positief. "
            "Aan de negatieve kant staan moties over wettelijke erkenning van meerouderschap, "
            "abortusrecht in het EU-Handvest, armoedebeleid en sociaal-maatschappelijke thema's. "
            "SP, VVD, GL-PvdA, PvdD en Volt scoren negatief."
        ),
        "positive_pole": "Christelijk-sociaal: ChristenUnie, SGP, CDA, NSC — gemeenschap en vrijwilligers",
        "negative_pole": "Progressief-individueel: SP, VVD, GL-PvdA, PvdD, Volt — individuele rechten",
        "flip": False,
    },
    6: {
        "label": "Ecologische transitie versus economische conservatie",
        "explanation": (
            "Deze as combineert migratie- en culturele posities. Aan de positieve kant staan "
            "moties over asielrestricties, nationale cultuur en identiteit, en beperkte "
            "immigratie. PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD en DENK scoren positief. "
            "Aan de negatieve kant staan moties over klimaatmaatregelen, progressieve "
            "inclusie, discriminatiebestrijding en internationale samenwerking. "
            "SP, PvdD, D66, GL-PvdA en Volt scoren negatief. "
            "De as scheidt partijen met restrictief migratiebeleid van partijen met "
            "progressief-inclusief beleid."
        ),
        "positive_pole": "Restrictief migratiebeleid: PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD, DENK",
        "negative_pole": "Progressieve inclusie: SP, PvdD, D66, GL-PvdA, Volt — klimaat en diversiteit",
        "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": "Internationale samenwerking versus nationale soevereiniteit",
        "explanation": (
            "Een residuele as die overwegend thematisch diverse moties uit 2024-2025 vangt. "
            "Aan de positieve kant staan moties over vaccinatiegraad-verlaging voor kinderen, "
            "een VWO-profiel kunst en cultuur, stages voor mbo-studenten in het buitenland, "
            "en woningbouw voor jongeren in kleine kernen. BBB, SGP en JA21 scoren positief. "
            "Aan de negatieve kant staan moties over het instellen van een vaccinatiecommissie, "
            "heropening van het coronaoversterfte-onderzoek, regionale energiestrategieën "
            "en toegankelijkheid van het basispakket. SP, DENK en PvdD scoren sterk negatief. "
            "Deze as combineert onderwijs- en volksgezondheidsposities met regionale "
            "huisvestingsprioriteiten — het label is indicatief."
        ),
        "positive_pole": "Onderwijs en volksgezondheid: BBB, SGP, JA21 — vaccinatie, profielkeuze, woningbouw",
        "negative_pole": "Zorg en toegankelijkheid: SP, DENK, PvdD, Volt — coronaonderzoek, energie, basispakket",
        "flip": False,
    },
    9: {
        "label": "Pragmatische probleemoplossing versus regulering",
        "explanation": (
            "Deze as scheidt pragmatische, concrete probleemoplossing van idealistische "
            "systeemhervorming. Aan de positieve kant staan moties over naleving van de "
            "Financiële-verhoudingswet voor gemeenten, beperking van arbeidsmigratie, "
            "een nieuwe tandartsopleiding in Rotterdam, een actieplan tegen misbruik van "
            "hallucinerende geneesmiddelen en oplossingen voor milieuproblemen op Bonaire. "
            "SGP en ChristenUnie scoren sterk positief; ook DENK en SP. Aan de negatieve kant "
            "staan moties over een moratorium op geitenstallen, een verbod op gokadvertenties, "
            "verduidelijking van gronden voor voorlopige hechtenis, een leegstandbelasting "
            "en end-to-end-encryptie. D66, JA21 en PVV scoren negatief. "
            "Deze as is indicatief — de scores zijn smal en ideologisch divers."
        ),
        "positive_pole": "Pragmatisch-bestuurlijk: SGP, ChristenUnie, DENK, SP — concrete oplossingen",
        "negative_pole": "Systeemhervorming: D66, JA21, PVV — idealistische beleidsposities",
        "flip": False,
    },
    10: {
        "label": "Minder overheidsbemoeienis versus meer handhaving",
        "explanation": (
            "Deze as scheidt partijen die kritisch staan tegenover overheidsbemoeienis van "
            "partijen die strikte regulering en handhaving steunen. Aan de positieve kant "
            "staan moties over minder tijdsintensieve schoolinspecties, het recht van "
            "toeslagenouders op hun persoonlijk dossier, behoud van tegemoetkomingen voor "
            "arbeidsongeschikten en verlaging van de leeftijdsdrempel voor kindgesprekken. "
            "DENK, SP en PvdD scoren positief. Aan de negatieve kant staan moties over "
            "een aangifteplicht voor scholen bij veiligheidsincidenten, een rookverbod in "
            "auto's met kinderen, braakliggende landbouwgrond en verhoogd beloningsgeld "
            "voor tipgevers. GroenLinks-PvdA scoort opvallend sterk negatief. "
            "Deze as is indicatief — de scores zijn smal en de partijcombinaties divers."
        ),
        "positive_pole": "Kritisch op overheidsbemoeienis: DENK, SP, PvdD — minder inspectielast en lastenverlichting",
        "negative_pole": "Pro-regulering: GroenLinks-PvdA, CDA, SGP — veiligheid, naleving en handhaving",
        "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",
}
