package cz.moneta.test.dsl.util.data.generators;

import cz.moneta.test.dsl.util.data.client.Gender;
import cz.moneta.test.harness.context.StoreAccessor;
import cz.moneta.test.harness.support.data.Generator;

import java.util.concurrent.ThreadLocalRandom;

public class FirstNameGenerator implements Generator<String> {

    private static final String[] FIRST_NAMES = new String[]{
            "Adam", "Adolf", "Adrian", "Alan", "Albert", "Aleš", "Alex", "Alexander", "Alexandr", "Alexej", "Alfred", "Alois", "Andrej", "Anton", "Antonín",
            "Arnošt", "Artur", "Augustin", "Bartoloměj", "Bedřich", "Benedikt", "Benjamin", "Blahoslav", "Bohdan", "Bohumil", "Bohumír", "Bohuslav", "Boleslav",
            "Boris", "Bořek", "Bořivoj", "Bronislav", "Bruno", "Břetislav", "Ctibor", "Ctirad", "Cyril", "Čeněk", "Čestmír", "Dalibor", "Damián", "Dan",
            "Daniel", "David", "Denis", "Dominik", "Drahomír", "Drahoslav", "Dušan", "Eduard", "Edvard", "Eliáš", "Emanuel", "Emil", "Erik", "Ervín", "Evžen",
            "Felix", "Ferdinand", "Filip", "František", "Gabriel", "Gustav", "Herbert", "Hubert", "Hugo", "Hynek", "Christian", "Igor", "Imrich", "Ivan", "Ivo",
            "Jáchym", "Jakub", "Jan", "Jarmil", "Jaromír", "Jaroslav", "Jindřich", "Jiří", "Jonáš", "Josef", "Jozef", "Julius", "Július", "Juraj", "Kamil",
            "Karel", "Kevin", "Kristian", "Kristián", "Kryštof", "Květoslav", "Ladislav", "Leo", "Leopold", "Leoš", "Libor", "Lubomír", "Lubor", "Luboš",
            "Luděk", "Ludvík", "Lukáš", "Lumír", "Marcel", "Marek", "Marián", "Mario", "Martin", "Matěj", "Matouš", "Matyáš", "Max", "Maxmilián", "Metoděj",
            "Michael", "Michal", "Mikuláš", "Milan", "Miloslav", "Miloš", "Miroslav", "Mojmír", "Nicolas", "Nikolas", "Norbert", "Oldřich", "Oliver", "Ondřej",
            "Oskar", "Ota", "Otakar", "Oto", "Otto", "Patrik", "Pavel", "Pavol", "Peter", "Petr", "Prokop", "Přemysl", "Radek", "Radim", "Radislav", "Radko",
            "Radomil", "Radomír", "Radoslav", "Radovan", "René", "Richard", "Robert", "Robin", "Roland", "Roman", "Rostislav", "Rudolf", "Samuel", "Sebastián",
            "Slavomír", "Stanislav", "Svatopluk", "Svatoslav", "Šimon", "Štefan", "Štěpán", "Tadeáš", "Teodor", "Theodor", "Tibor", "Tobiáš", "Tomáš", "Václav",
            "Vasil", "Vavřinec", "Vendelín", "Věroslav", "Viktor", "Vilém", "Viliam", "Vincent", "Vít", "Vítek", "Vítězslav", "Vladimír", "Vladislav",
            "Vlastimil", "Vlastimír", "Vlastislav", "Vojtěch", "Vratislav", "Zbyněk", "Zbyšek", "Zdeněk"
    };

    private static final String[] WOMAN_FIRST_NAMES = new String[]{
            "Adéla", "Adriana", "Agáta", "Alena", "Alenka", "Alex", "Alexandra", "Alice", "Alžběta", "Amálie", "Anděla", "Andrea", "Aneta", "Anežka", "Anita",
            "Anna", "Antonie", "Bára", "Barbara", "Barbora", "Beáta", "Blanka", "Blažena", "Bohdana", "Bohumila", "Božena", "Bronislava", "Dagmar", "Dana",
            "Daniela", "Danuše", "Danuška", "Darina", "Dáša", "Denisa", "Diana", "Dita", "Dominika", "Dorota", "Drahomíra", "Drahoslava", "Edita", "Elen", "Elena",
            "Eliška", "Ella", "Ema", "Emilie", "Emma", "Erika", "Ester", "Eva", "Františka", "Gabriela", "Hana", "Hedvika", "Helena", "Ilona", "Ingrid", "Irena",
            "Iva", "Ivana", "Ivanka", "Iveta", "Ivona", "Jana", "Jarmila", "Jaromíra", "Jaroslava", "Jindra", "Jindřiška", "Jiřina", "Jitka", "Johana", "Jolana",
            "Josefa", "Julie", "Kamila", "Karin", "Karla", "Karolina", "Karolína", "Kateřina", "Klára", "Klaudie", "Kristina", "Kristýna", "Květa", "Květoslava",
            "Květuše", "Lada", "Ladislava", "Laura", "Lea", "Lenka", "Leona", "Libuše", "Lidmila", "Liliana", "Linda", "Lucie", "Ludmila", "Lydie", "Magda",
            "Magdalena", "Magdaléna", "Marcela", "Margita", "Maria", "Mariana", "Marie", "Marika", "Markéta", "Marta", "Martina", "Michaela", "Michala", "Milada",
            "Milena", "Miloslava", "Miluše", "Miluška", "Miriam", "Miroslava", "Monika", "Naďa", "Naděžda", "Natalie", "Nataša", "Nela", "Nella", "Nicol", "Nicole",
            "Nikol", "Nikola", "Nina", "Oldřiška", "Olga", "Ota", "Patricie", "Pavla", "Pavlína", "Petra", "Radana", "Radka", "Radmila", "Radomíra", "Regina",
            "Renata", "Renáta", "René", "Romana", "Rozálie", "Růžena", "Sabina", "Sandra", "Sára", "Silvie", "Simona", "Sofie", "Soňa", "Stanislava", "Svatava",
            "Světlana", "Sylva", "Sylvie", "Šárka", "Štěpánka", "Tamara", "Táňa", "Taťána", "Tereza", "Terezie", "Václava", "Valentýna", "Valerie", "Vanda", "Vanesa",
            "Vanessa", "Vendula", "Věra", "Veronika", "Viera", "Viktorie", "Vilma", "Vladimíra", "Vladislava", "Vlasta", "Vlastimila", "Yveta", "Yvona", "Zdena",
            "Zdenka", "Zdeňka", "Zlata", "Zlatuše", "Zora", "Zuzana", "Žaneta", "Žofie"
    };

    @Override
    public String generate(StoreAccessor harness, Object... params) {
        if (params != null && params.length != 0 && params[0] instanceof Gender && params[0] == Gender.WOMAN) {
            return WOMAN_FIRST_NAMES[ThreadLocalRandom.current().nextInt(WOMAN_FIRST_NAMES.length)];
        }
        return FIRST_NAMES[ThreadLocalRandom.current().nextInt(FIRST_NAMES.length)];
    }
}
