package org.raddatz.familienarchiv.person;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.raddatz.familienarchiv.person.PersonType;

import static org.assertj.core.api.Assertions.assertThat;

class PersonTypeClassifierTest {

    // --- SKIP ---

    @ParameterizedTest
    @CsvSource({
            "'Briefumschlag aus Java', SKIP",
            "'Kondolenzbriefe zum Tod von Walter de Gruyter', SKIP",
            "'Hochzeitsgedicht fur Paul u Luise de Gruyter', SKIP"
    })
    void classify_skipEntries(String input, PersonType expected) {
        assertThat(PersonTypeClassifier.classify(input)).isEqualTo(expected);
    }

    // --- INSTITUTION ---

    @ParameterizedTest
    @CsvSource({
            "'Arthur Collignon GmbH', INSTITUTION",
            "'Firma Auschrath', INSTITUTION",
            "'Westermann u Co', INSTITUTION",
            "'Architekt Korschelt u Renker', INSTITUTION",
            "'Steuerfinanzamt', INSTITUTION",
            "'Reichsfechtschule', INSTITUTION"
    })
    void classify_institutionEntries(String input, PersonType expected) {
        assertThat(PersonTypeClassifier.classify(input)).isEqualTo(expected);
    }

    // --- GROUP ---

    @ParameterizedTest
    @CsvSource({
            "'Comite der Abschiedsfeier', GROUP",
            "'Comité zur Errichtung eines Heine-Denkmals', GROUP",
            "'Garde du Corps', GROUP",
            "'Geschwister de Gruyter', GROUP",
            "'Gesellschafter des Verlages', GROUP",
            "'Ella de Gruyters Eltern', GROUP",
            "'Eugenie de Gruyters Kinder', GROUP",
            "'Hilde de Gruyters Schwiegereltern', GROUP",
            "'Eltern Muller', GROUP",
            "'Familie Cram', GROUP",
            "'Familie Hasenvlever', GROUP",
            "'Mitarbeiter Verlag', GROUP",
            "'Mitarbeiter Druckerei TrebbinClara Cram', GROUP",
            "'Mitarbeiter Kunstverlag Mu', GROUP"
    })
    void classify_groupEntries(String input, PersonType expected) {
        assertThat(PersonTypeClassifier.classify(input)).isEqualTo(expected);
    }

    // --- PERSON (default) ---

    @ParameterizedTest
    @CsvSource({
            "'Walter de Gruyter', PERSON",
            "'Clara Cram', PERSON",
            "'Eugenie de Gruyter geb. Müller', PERSON",
            "'Dr. Firma Mueller', PERSON"
    })
    void classify_personEntries(String input, PersonType expected) {
        assertThat(PersonTypeClassifier.classify(input)).isEqualTo(expected);
    }

    // --- Edge cases ---

    @Test
    void classify_null_returnsPerson() {
        assertThat(PersonTypeClassifier.classify(null)).isEqualTo(PersonType.PERSON);
    }

    @Test
    void classify_blank_returnsPerson() {
        assertThat(PersonTypeClassifier.classify("   ")).isEqualTo(PersonType.PERSON);
    }

    @Test
    void classify_caseInsensitive() {
        assertThat(PersonTypeClassifier.classify("firma auschrath")).isEqualTo(PersonType.INSTITUTION);
    }

    @Test
    void classify_containsWord_findsSecondOccurrence() {
        assertThat(PersonTypeClassifier.classify("Nachbareltern Eltern")).isEqualTo(PersonType.GROUP);
    }
}
