package com.developx.szpitale.ingest.normalize;

import com.developx.szpitale.model.enums.AffiliationType;
import com.developx.szpitale.model.enums.ConfidenceLevel;

import java.util.Map;
import java.util.Set;

public class PartyNormalizer {

    private static final Map<String, String> PARTY_CANONICAL_MAPPINGS = Map.ofEntries(
            Map.entry("koalicja obywatelska", "Koalicja Obywatelska"),
            Map.entry("po", "Koalicja Obywatelska"),
            Map.entry("polska oferta", "Koalicja Obywatelska"),
            Map.entry("ko", "Koalicja Obywatelska"),
            Map.entry("prawo i sprawiedliwosc", "Prawo i Sprawiedliwo\u015b\u0107"),
            Map.entry("pis", "Prawo i Sprawiedliwo\u015b\u0107"),
            Map.entry("psl", "PSL"),
            Map.entry("polska 2050", "Polska 2050"),
            Map.entry("trzecia droga", "Trzecia Droga"),
            Map.entry("polska 2050 pisl", "Trzecia Droga"),
            Map.entry("sl d", "SLD"),
            Map.entry("lewica", "Lewica"),
            Map.entry("prawica rzeczpospolitej", "Prawica Rzeczypospolitej"),
            Map.entry("ruch ludowy", "Ruch Ludowy"),
            Map.entry("kww", "KWW_LOKALNY")
    );

    private static final Set<String> KOMMIT_SET = Set.of(
            "kww", "komitet wyborczy", "komitet lokalny", "komitet wyborc\u00f3w"
    );

    public String canonicalize(String rawName) {
        String lower = rawName.toLowerCase().trim();
        if (PARTY_CANONICAL_MAPPINGS.containsKey(lower)) {
            return PARTY_CANONICAL_MAPPINGS.get(lower);
        }
        for (Map.Entry<String, String> entry : PARTY_CANONICAL_MAPPINGS.entrySet()) {
            if (lower.contains(entry.getKey())) {
                return entry.getValue();
            }
        }
        return rawName;
    }

    public AffiliationType determineType(String rawName) {
        String lower = rawName.toLowerCase();
        if (lower.contains("kww") || lower.contains("komitet wyborc\u00f3w")) {
            return AffiliationType.KWW_LOKALNY;
        }
        if (lower.contains("komitet")) {
            return AffiliationType.KOMITET_WYBORCZY;
        }
        return AffiliationType.PARTIA;
    }

    public ConfidenceLevel mapConfidence(String confidenceText) {
        if (confidenceText == null) return ConfidenceLevel.BRAK_DANYCH;
        String lower = confidenceText.toLowerCase();
        if (lower.contains("brak danych")) return ConfidenceLevel.BRAK_DANYCH;
        if (lower.contains("niezweryfik")) return ConfidenceLevel.NIEZWERYFIKOWANA;
        if (lower.contains("niepotwierdzona")) return ConfidenceLevel.NIEPOTWIERDZONA;
        return ConfidenceLevel.POTWIERDZONA;
    }
}
