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 LastNameGenerator implements Generator<String> {

    private static final String[] LAST_NAMES = new String[]{
            "Adamec", "Adámek", "Ambrož", "Anděl", "Bajer", "Balog", "Baloun", "Bareš", "Bárta", "Barták", "Bartoš", "Bartošek", "Bartůněk", "Bašta", "Bauer",
            "Bayer", "Bečvář", "Bednář", "Bednařík", "Bělohlávek", "Benda", "Beneš", "Beran", "Beránek", "Berka", "Bezděk", "Bílek", "Bílý", "Bittner", "Bláha",
            "Blažek", "Blecha", "Boček", "Boháč", "Boháček", "Borovička", "Bouček", "Brabec", "Brabenec", "Bradáč", "Brázda", "Brázdil", "Brejcha", "Brož",
            "Brožek", "Brychta", "Březina", "Buchta", "Burda", "Bureš", "Burian", "Buriánek", "Cibulka", "Cihlář", "Císař", "Coufal", "Čáp", "Čapek", "Čech",
            "Čejka", "Čermák", "Černík", "Černohorský", "Černoch", "Černý", "Červeňák", "Červenka", "Červený", "Červinka", "Čihák", "Čížek", "Daněk", "Diviš",
            "Dlouhý", "Dobeš", "Dobrovolný", "Dočekal", "Dočkal", "Dohnal", "Dokoupil", "Doleček", "Dolejš", "Dolejší", "Doležal", "Doležel", "Dostál",
            "Doubek", "Doubrava", "Drábek", "Drozd", "Dubský", "Duda", "Dudek", "Dušek", "Dvorský", "Dvořáček", "Dvořák", "Erben", "Fiala", "Fischer", "Fišer",
            "Fojtík", "Forman", "Formánek", "Fousek", "Franc", "Franěk", "Fučík", "Fuchs", "Fuksa", "Hájek", "Hajný", "Hampl", "Hanáček", "Hanák", "Hanousek",
            "Hanus", "Hanuš", "Hanzal", "Hanzlík", "Hašek", "Havel", "Havelka", "Havlíček", "Havlík", "Havránek", "Hejda", "Hejl", "Hejna", "Herman", "Heřman",
            "Heřmánek", "Hladík", "Hladký", "Hlaváč", "Hlaváček", "Hlavatý", "Hlávka", "Hloušek", "Hoffmann", "Hofman", "Holan", "Holeček", "Holík", "Holoubek",
            "Holub", "Holý", "Homola", "Homolka", "Hora", "Horáček", "Horák", "Horký", "Horňák", "Horníček", "Horník", "Horský", "Horvát", "Horváth", "Hořejší",
            "Hošek", "Houdek", "Houška", "Hovorka", "Hrabal", "Hrabovský", "Hradecký", "Hradil", "Hrbáček", "Hrbek", "Hrdina", "Hrdlička", "Hrdý", "Hrnčíř",
            "Hromádka", "Hron", "Hrubeš", "Hrubý", "Hruška", "Hubáček", "Hudec", "Hudeček", "Huml", "Husák", "Chaloupka", "Chalupa", "Charvát", "Chládek",
            "Chmelař", "Chmelík", "Chovanec", "Chromý", "Chudoba", "Chvátal", "Chytil", "Jahoda", "Jakoubek", "Jakubec", "Janáček", "Janák", "Janata", "Jančík",
            "Janda", "Janeček", "Janečka", "Janíček", "Janík", "Janota", "Janoušek", "Janovský", "Jánský", "Jaroš", "Javůrek", "Jedlička", "Jelínek", "Jeřábek",
            "Ježek", "Jílek", "Jindra", "Jirák", "Jiránek", "Jirásek", "Jiroušek", "Kabát", "Kadlec", "Kafka", "Kaiser", "Kalina", "Kalivoda", "Kalousek",
            "Kameník", "Kaňka", "Kantor", "Karas", "Karásek", "Kasal", "Kašpar", "Kašpárek", "Kazda", "Klečka", "Klement", "Klíma", "Klimeš", "Klouda",
            "Knotek", "Kocián", "Kocourek", "Kočí", "Kohout", "Kohoutek", "Koláček", "Kolář", "Kolařík", "Komárek", "Komínek", "Konečný", "Koníček", "Kopal",
            "Kopecký", "Kopeček", "Kopřiva", "Kořínek", "Kos", "Kosina", "Kostka", "Košťál", "Kotek", "Kouba", "Koubek", "Koudela", "Koudelka", "Koukal",
            "Kouřil", "Koutný", "Kováč", "Kovář", "Kovařík", "Kovářík", "Kozák", "Kozel", "Krajíček", "Král", "Králíček", "Králík", "Krátký", "Kratochvíl",
            "Kraus", "Krčmář", "Krejčí", "Krejčík", "Krejčíř", "Kropáček", "Kroupa", "Krupička", "Krupka", "Křeček", "Křenek", "Křivánek", "Kříž", "Křížek",
            "Kubát", "Kubec", "Kubelka", "Kubeš", "Kubica", "Kubíček", "Kubík", "Kubín", "Kubiš", "Kučera", "Kudláček", "Kuchař", "Kulhánek", "Kulhavý", "Kunc",
            "Kuneš", "Kupka", "Kvapil", "Kvasnička", "Kysela", "Landa", "Lang", "Langer", "Lavička", "Levý", "Linhart", "Liška", "Lorenc", "Louda", "Lukeš",
            "Macek", "Macura", "Mach", "Mácha", "Macháček", "Machala", "Machálek", "Machek", "Majer", "Málek", "Malík", "Malina", "Malý", "Maňák", "Mareček",
            "Marek", "Mareš", "Maršálek", "Maršík", "Martinec", "Martinek", "Martínek", "Mařík", "Mašek", "Matějíček", "Matějka", "Matoušek", "Matula",
            "Matuška", "Mayer", "Medek", "Melichar", "Mencl", "Menšík", "Merta", "Michalec", "Michálek", "Michalík", "Mikeš", "Mikula", "Minařík", "Mládek",
            "Mlejnek", "Mokrý", "Moravec", "Morávek", "Motyčka", "Moučka", "Moudrý", "Mráček", "Mráz", "Mrázek", "Mrkvička", "Mucha", "Musil", "Mužík",
            "Navrátil", "Nečas", "Nedbal", "Nedoma", "Nedvěd", "Nejedlý", "Němec", "Němeček", "Nesvadba", "Neumann", "Nosek", "Nováček", "Novák", "Novosad",
            "Novotný", "Nový", "Odehnal", "Oliva", "Ondráček", "Paleček", "Pánek", "Pašek", "Patočka", "Pavelka", "Pavlas", "Pavlica", "Pavlíček", "Pavlík",
            "Pazdera", "Pecka", "Pech", "Pecha", "Pecháček", "Pekárek", "Pekař", "Pelc", "Pelikán", "Peroutka", "Peřina", "Pešek", "Peterka", "Petr", "Petrák",
            "Petříček", "Petřík", "Pilař", "Pilát", "Plaček", "Plachý", "Podzimek", "Pohl", "Pokorný", "Poláček", "Polách", "Polák", "Polášek", "Polívka",
            "Popelka", "Pospíchal", "Pospíšil", "Potůček", "Prachař", "Prášek", "Pražák", "Prchal", "Procházka", "Prokeš", "Prokop", "Prošek", "Provazník",
            "Průcha", "Průša", "Přibyl", "Příhoda", "Přikryl", "Pšenička", "Ptáček", "Rada", "Rambousek", "Rezek", "Richter", "Roubal", "Rozsypal", "Růžek",
            "Růžička", "Ryšavá", "Ryšavý", "Řeháček", "Řehák", "Řezáč", "Řezníček", "Říha", "Sedláček", "Sedlák", "Sedlář", "Sehnal", "Seidl", "Sekanina",
            "Severa", "Schejbal", "Schneider", "Schwarz", "Sikora", "Sivák", "Skácel", "Skála", "Skalický", "Sklenář", "Skopal", "Skřivánek", "Slabý", "Sládek",
            "Sladký", "Sláma", "Slanina", "Slavíček", "Slavík", "Slezák", "Slováček", "Slovák", "Sluka", "Smejkal", "Smékal", "Smetana", "Smolík", "Smolka",
            "Smrčka", "Smutný", "Sobotka", "Sochor", "Sojka", "Sokol", "Souček", "Soukup", "Spáčil", "Staněk", "Stárek", "Starý", "Stehlík", "Steiner",
            "Stejskal", "Straka", "Stránský", "Strejček", "Strnad", "Strouhal", "Studený", "Studnička", "Stuchlík", "Stupka", "Suchánek", "Suchomel", "Suchý",
            "Svatoš", "Svoboda", "Sýkora", "Synek", "Syrový", "Šafařík", "Šafránek", "Šašek", "Šebek", "Šebesta", "Šedivý", "Šesták", "Ševčík", "Šíma",
            "Šimáček", "Šimánek", "Šimeček", "Šimek", "Šimůnek", "Šindelář", "Šípek", "Široký", "Šiška", "Škoda", "Šlechta", "Šmejkal", "Šmíd", "Šnajdr",
            "Šolc", "Špaček", "Šrámek", "Šťastný", "Štefan", "Štefek", "Štěpán", "Štěpánek", "Šubrt", "Šulc", "Šustr", "Švanda", "Švarc", "Švec", "Švehla",
            "Švejda", "Švestka", "Táborský", "Teplý", "Tesař", "Tichý", "Toman", "Tománek", "Tomášek", "Tomeček", "Tomek", "Tomeš", "Trávníček", "Trnka",
            "Trojan", "Truhlář", "Tuček", "Tůma", "Tureček", "Turek", "Uhlíř", "Ulrich", "Urban", "Urbanec", "Urbánek", "Vacek", "Václavek", "Václavík",
            "Vaculík", "Vágner", "Vácha", "Valášek", "Válek", "Valenta", "Váňa", "Vančura", "Vaněček", "Vaněk", "Vaníček", "Vašíček", "Vávra", "Večeřa",
            "Vejvoda", "Verner", "Veselý", "Veverka", "Vitásek", "Vítek", "Vlach", "Vlasák", "Vlček", "Vlk", "Vobořil", "Vodička", "Vojáček", "Vokoun",
            "Vondra", "Vondrák", "Voráček", "Vorel", "Vorlíček", "Voříšek", "Votava", "Votruba", "Vrabec", "Vrána", "Vrba", "Vrzal", "Vybíral", "Vydra",
            "Vysloužil", "Zábranský", "Zahradník", "Zach", "Zajíc", "Zajíček", "Zámečník", "Zapletal", "Záruba", "Zatloukal", "Zavadil", "Zavřel", "Zbořil",
            "Zdražil", "Zedník", "Zelenka", "Zelený", "Zemánek", "Zima", "Zlámal", "Zoubek", "Zouhar", "Zvěřina", "Žáček", "Žák", "Žďárský", "Žemlička", "Žižka"
    };

    private static final String[] WOMAN_LAST_NAMES = new String[]{
            "Adamcová", "Adámková", "Adamová", "Albrechtová", "Ambrožová", "Andělová", "Andrlová", "Antošová", "Bajerová", "Balážová", "Balcarová", "Balogová",
            "Barešová", "Bartáková", "Bartoňová", "Bartošková", "Bartošová", "Bártová", "Bauerová", "Bečvářová", "Bednaříková", "Bednářová", "Bendová", "Benešová",
            "Beránková", "Beranová", "Bergerová", "Berková", "Bezděková", "Bílá", "Bílková", "Blahová", "Bláhová", "Blažková", "Blechová", "Bobková", "Bočková",
            "Boháčová", "Böhmová", "Boučková", "Boudová", "Boušková", "Brabcová", "Bradáčová", "Brázdová", "Brejchová", "Brožková", "Brožová", "Brychtová",
            "Březinová", "Bučková", "Buchtová", "Burdová", "Burešová", "Burianová", "Cibulková", "Cihlářová", "Císařová", "Coufalová", "Čadová", "Čapková",
            "Čápová", "Čechová", "Čejková", "Čermáková", "Černá", "Černíková", "Černohorská", "Černochová", "Červená", "Červeňáková", "Červenková", "Červinková",
            "Čiháková", "Čížková", "Čonková", "Danielová", "Daňková", "Davidová", "Demeterová", "Divišová", "Dlouhá", "Dobešová", "Dobiášová", "Dobrovolná",
            "Dočekalová", "Dočkalová", "Dohnalová", "Dokoupilová", "Dolejšová", "Doležalová", "Doleželová", "Dostálová", "Doubková", "Doubravová", "Drábková",
            "Drozdová", "Dubová", "Dubská", "Dudková", "Dudová", "Dufková", "Dušková", "Dvorská", "Dvořáčková", "Dvořáková", "Eliášová", "Fantová", "Fenclová",
            "Ferencová", "Fialová", "Fiedlerová", "Filipová", "Fischerová", "Fišerová", "Fojtíková", "Foltýnová", "Formánková", "Formanová", "Fořtová", "Francová",
            "Franková", "Fraňková", "Fridrichová", "Fučíková", "Fuchsová", "Gáborová", "Gabrielová", "Gajdošová", "Gregorová", "Hájková", "Hajná", "Hálová",
            "Hamplová", "Hanáková", "Hanusová", "Hanušová", "Hanzlíková", "Hanzlová", "Hartmanová", "Hašková", "Havelková", "Havlíčková", "Havlíková", "Havlová",
            "Havránková", "Hejdová", "Hejduková", "Hejlová", "Hendrychová", "Hermanová", "Heřmanová", "Hladíková", "Hladká", "Hlaváčková", "Hlaváčová", "Hlavatá",
            "Hloušková", "Hoffmannová", "Hofmanová", "Holá", "Holcová", "Holečková", "Holíková", "Holubová", "Homolková", "Homolová", "Horáčková", "Horáková",
            "Horká", "Horová", "Horská", "Horváthová", "Horvátová", "Hošková", "Houdková", "Houšková", "Hovorková", "Hrabalová", "Hradecká", "Hradilová", "Hrbková",
            "Hrdinová", "Hrdličková", "Hrnčířová", "Hromádková", "Hronová", "Hrubá", "Hrušková", "Hrůzová", "Hubáčková", "Hudcová", "Hudečková", "Humlová",
            "Hurtová", "Husáková", "Hušková", "Hynková", "Chaloupková", "Chalupová", "Charvátová", "Chládková", "Chmelařová", "Chmelíková", "Chmelová", "Chovancová",
            "Chvátalová", "Chvojková", "Chytilová", "Jahodová", "Jakešová", "Jakubcová", "Janáčková", "Janáková", "Jančíková", "Jančová", "Jandová", "Janečková",
            "Janíčková", "Janíková", "Janková", "Janoušková", "Janovská", "Jansová", "Jarošová", "Jašková", "Javůrková", "Jedličková", "Jelínková", "Jeřábková",
            "Ježková", "Jílková", "Jindrová", "Jiráková", "Jirásková", "Jiroušková", "Jonášová", "Junková", "Jurečková", "Jurková", "Kadeřábková", "Kadlecová",
            "Kafková", "Kalinová", "Kalousová", "Kaňková", "Kantorová", "Kaplanová", "Karásková", "Karasová", "Karlíková", "Karlová", "Kasalová", "Kašpárková",
            "Kašparová", "Kazdová", "Kindlová", "Klečková", "Kleinová", "Klementová", "Klimešová", "Klímová", "Kloudová", "Knotková", "Kociánová", "Kocourková",
            "Kočová", "Kohoutková", "Kohoutová", "Koláčková", "Kolaříková", "Kolářová", "Komárková", "Konečná", "Kopecká", "Kopečková", "Kopečná", "Kopřivová",
            "Korbelová", "Kořínková", "Kosová", "Kostková", "Košťálová", "Kotková", "Koubková", "Koubová", "Koudelková", "Koudelová", "Koukalová", "Kouřilová",
            "Koutná", "Kováčová", "Kovaříková", "Kováříková", "Kovářová", "Kozáková", "Kozlová", "Králíková", "Králová", "Krátká", "Kratochvílová", "Krausová",
            "Krčmářová", "Krejčíková", "Krejčová", "Kroupová", "Krupičková", "Křenková", "Křivánková", "Křížková", "Křížová", "Kubátová", "Kubešová", "Kubíčková",
            "Kubíková", "Kubínová", "Kubová", "Kučerová", "Kudláčková", "Kudrnová", "Kuchařová", "Kuklová", "Kulhánková", "Kuncová", "Kupková", "Kurková", "Kuželová",
            "Kvapilová", "Kvasničková", "Kyselová", "Lacinová", "Lacková", "Landová", "Langerová", "Langová", "Langrová", "Lebedová", "Linhartová", "Lišková",
            "Lorencová", "Loudová", "Ludvíková", "Lukášová", "Lukešová", "Macková", "Macháčková", "Machačová", "Machálková", "Machalová", "Machová", "Máchová",
            "Majerová", "Malá", "Malíková", "Malinová", "Málková", "Marečková", "Marešová", "Marková", "Maršálková", "Maršíková", "Martincová", "Martinková",
            "Martínková", "Maříková", "Mašková", "Matějková", "Matoušková", "Matoušová", "Matulová", "Matušková", "Matyášová", "Medková", "Melicharová", "Menšíková",
            "Mertová", "Mičková", "Michálková", "Michalová", "Mikešová", "Miková", "Míková", "Mikulová", "Minaříková", "Mlčochová", "Moravcová", "Morávková",
            "Motyčková", "Mrázková", "Mrázová", "Muchová", "Müllerová", "Műllerová", "Musilová", "Mužíková", "Myšková", "Nagyová", "Najmanová", "Navrátilová",
            "Nečasová", "Nedvědová", "Nejedlá", "Němcová", "Němečková", "Neubauerová", "Neumannová", "Nguyenová", "Nosková", "Nová", "Nováčková", "Nováková",
            "Novotná", "Odehnalová", "Oláhová", "Ondráčková", "Ondrová", "Ottová", "Palečková", "Pánková", "Pařízková", "Pašková", "Pátková", "Pavelková",
            "Pavlíčková", "Pavlíková", "Pavlová", "Pazderová", "Pecková", "Pecháčková", "Pechová", "Pekárková", "Pekařová", "Pelcová", "Pelikánová", "Peřinová",
            "Pešková", "Peštová", "Peterková", "Peterová", "Petráková", "Petrášová", "Petrová", "Petříková", "Picková", "Pilařová", "Plačková", "Plachá",
            "Pohlová", "Pokorná", "Poláčková", "Poláchová", "Poláková", "Polanská", "Polášková", "Polívková", "Popelková", "Pospíchalová", "Pospíšilová",
            "Pražáková", "Prchalová", "Procházková", "Prokešová", "Prokopová", "Prošková", "Provazníková", "Průchová", "Průšová", "Přibylová", "Příhodová",
            "Přikrylová", "Ptáčková", "Radová", "Raková", "Rašková", "Rezková", "Richterová", "Richtrová", "Rudolfová", "Růžičková", "Rybářová", "Rybová",
            "Ryšavá", "Řeháková", "Řehořová", "Řezáčová", "Řezníčková", "Říhová", "Sadílková", "Samková", "Sedláčková", "Sedláková", "Sedlářová", "Seidlová",
            "Schejbalová", "Schmidtová", "Schneiderová", "Schwarzová", "Sikorová", "Siváková", "Skácelová", "Skalická", "Skalová", "Skálová", "Sklenářová",
            "Skopalová", "Skřivánková", "Slabá", "Sládková", "Slámová", "Slaninová", "Slavíčková", "Slavíková", "Slezáková", "Slováčková", "Slováková", "Smejkalová",
            "Smékalová", "Smetanová", "Smolíková", "Smolková", "Smolová", "Smrčková", "Smutná", "Sobotková", "Sochorová", "Sojková", "Sokolová", "Součková",
            "Soukupová", "Sovová", "Spáčilová", "Spurná", "Srbová", "Staňková", "Stará", "Stárková", "Stehlíková", "Stejskalová", "Stoklasová", "Straková", "Stránská",
            "Strnadová", "Strouhalová", "Studená", "Stuchlíková", "Suchá", "Suchánková", "Suchomelová", "Suková", "Svatošová", "Svobodová", "Sýkorová", "Synková",
            "Šafaříková", "Šafářová", "Šafránková", "Šandová", "Šebestová", "Šebková", "Šedivá", "Šedová", "Šestáková", "Ševčíková", "Šimečková", "Šimková", "Šimonová",
            "Šímová", "Šimůnková", "Šindelářová", "Šindlerová", "Šípková", "Široká", "Šišková", "Škodová", "Šlechtová", "Šmejkalová", "Šmídová", "Šnajdrová", "Šolcová",
            "Špačková", "Šrámková", "Šťastná", "Štefanová", "Štefková", "Štěpánková", "Štěpánová", "Štěrbová", "Šubrtová", "Šulcová", "Šustrová", "Švábová", "Švarcová",
            "Švecová", "Švehlová", "Švejdová", "Táborská", "Teplá", "Tesařová", "Tichá", "Tománková", "Tomanová", "Tomášková", "Tomášová", "Tomečková", "Tomková",
            "Tóthová", "Trávníčková", "Trčková", "Trnková", "Trojanová", "Třísková", "Tučková", "Tůmová", "Turková", "Uhlířová", "Uhrová", "Ulrichová", "Urbánková",
            "Urbanová", "Vacková", "Václavíková", "Václavková", "Vaculíková", "Vágnerová", "Váchová", "Valášková", "Valentová", "Valešová", "Válková", "Valová",
            "Vančurová", "Vaněčková", "Vaníčková", "Vaňková", "Váňová", "Vargová", "Vašíčková", "Vašková", "Vávrová", "Večeřová", "Vejvodová", "Vernerová", "Veselá",
            "Veverková", "Víchová", "Vítková", "Vítová", "Vlachová", "Vlasáková", "Vlčková", "Vlková", "Vodičková", "Vojáčková", "Vojtěchová", "Vojtíšková", "Vojtová",
            "Volfová", "Volková", "Volná", "Vondráčková", "Vondráková", "Vondrová", "Vorlová", "Voříšková", "Votavová", "Vrabcová", "Vránová", "Vrbová", "Vybíralová",
            "Vyskočilová", "Wagnerová", "Weissová", "Wolfová", "Zahradníková", "Zachová", "Zajícová", "Zajíčková", "Zámečníková", "Zapletalová", "Zárubová",
            "Zatloukalová", "Zavadilová", "Zavřelová", "Zbořilová", "Zelená", "Zelenková", "Zelinková", "Zemánková", "Zemanová", "Zikmundová", "Zíková", "Zimová",
            "Zítková", "Zlámalová", "Zoubková", "Zouharová", "Žáčková", "Žáková", "Žigová", "Žižková"
    };

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