package com.developx.szpitale.ingest.normalize;

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

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class PartyNormalizerTest {

    private final PartyNormalizer normalizer = new PartyNormalizer();

    @Test
    void canonicalize_poAlias_toKoalicjaObywatelska() {
        assertEquals("Koalicja Obywatelska", normalizer.canonicalize("PO"));
    }

    @Test
    void canonicalize_koAlias_toKoalicjaObywatelska() {
        assertEquals("Koalicja Obywatelska", normalizer.canonicalize("KO"));
    }

    @Test
    void canonicalize_pisAlias_toPrawoISprawiedliwosc() {
        assertEquals("Prawo i Sprawiedliwość", normalizer.canonicalize("PiS"));
    }

    @Test
    void canonicalize_fullName_psl() {
        assertEquals("PSL", normalizer.canonicalize("PSL"));
    }

    @Test
    void canonicalize_fullName_polska2050() {
        assertEquals("Polska 2050", normalizer.canonicalize("Polska 2050"));
    }

    @Test
    void canonicalize_undefined_name_returnsOriginal() {
        String result = normalizer.canonicalize("Nowa Partia");
        assertEquals("Nowa Partia", result);
    }

    @Test
    void canonicalize_containsAlias_matchesSubstring() {
        String result = normalizer.canonicalize("KWW Nowak");
        assertEquals("KWW_LOKALNY", result);
    }

    @Test
    void determineType_kww_returnsKWW_LOKALNY() {
        assertEquals(AffiliationType.KWW_LOKALNY, normalizer.determineType("KWW Nowak"));
    }

    @Test
    void determineType_komitet_wyborczy_returnsKOMITET() {
        assertEquals(AffiliationType.KOMITET_WYBORCZY, normalizer.determineType("Komitet Wyborczy"));
    }

    @Test
    void determineType_unknown_returnsPARTIA() {
        assertEquals(AffiliationType.PARTIA, normalizer.determineType("Prawo i Sprawiedliwość"));
    }

    @Test
    void mapConfidence_niezweryfikowane_toNIEZWERYFIKOWANA() {
        assertEquals(ConfidenceLevel.NIEZWERYFIKOWANA, normalizer.mapConfidence("NIEZWERYFIKOWANE"));
    }

    @Test
    void mapConfidence_brak_danych_toBRAK_DANYCH() {
        assertEquals(ConfidenceLevel.BRAK_DANYCH, normalizer.mapConfidence("brak danych"));
    }

    @Test
    void mapConfidence_niepotwierdzona_toNIEPOTWIERDZONA() {
        assertEquals(ConfidenceLevel.NIEPOTWIERDZONA, normalizer.mapConfidence("brak/niepotwierdzona"));
    }

    @Test
    void mapConfidence_null_toBRAK_DANYCH() {
        assertEquals(ConfidenceLevel.BRAK_DANYCH, normalizer.mapConfidence(null));
    }

    @Test
    void mapConfidence_confirmed_default() {
        assertEquals(ConfidenceLevel.POTWIERDZONA, normalizer.mapConfidence("potwierdzone"));
    }
}
