use super::{
    common::{RustStemmer, StopWordFilter, RegexTrimmer},
    Language,
};
use crate::pipeline::Pipeline;
use rust_stemmers::Algorithm;

#[derive(Clone)]
pub struct Hungarian {}

impl Hungarian {
    pub fn new() -> Self {
        Self {}
    }
}

impl Language for Hungarian {
    fn name(&self) -> String {
        "Hungarian".into()
    }
    fn code(&self) -> String {
        "hu".into()
    }

    fn tokenize(&self, text: &str) -> Vec<String> {
        super::tokenize_whitespace(text)
    }

    fn make_pipeline(&self) -> Pipeline {
        Pipeline {
            queue: vec![
                Box::new(RegexTrimmer::new("trimmer-hu", r"\p{Latin}")),
                Box::new(StopWordFilter::new("stopWordFilter-hu", STOP_WORDS)),
                Box::new(RustStemmer::new("stemmer-hu", Algorithm::Hungarian)),
            ],
        }
    }
}

const STOP_WORDS: &[&str] = &[
    "",
    "a",
    "abba",
    "abban",
    "abból",
    "addig",
    "ahhoz",
    "ahogy",
    "ahol",
    "aki",
    "akik",
    "akkor",
    "akár",
    "alapján",
    "alatt",
    "alatta",
    "alattad",
    "alattam",
    "alattatok",
    "alattuk",
    "alattunk",
    "alá",
    "alád",
    "alájuk",
    "alám",
    "alánk",
    "alátok",
    "alól",
    "alóla",
    "alólad",
    "alólam",
    "alólatok",
    "alóluk",
    "alólunk",
    "amely",
    "amelybol",
    "amelyek",
    "amelyekben",
    "amelyeket",
    "amelyet",
    "amelyik",
    "amelynek",
    "ami",
    "amikor",
    "amit",
    "amolyan",
    "amott",
    "amíg",
    "annak",
    "annál",
    "arra",
    "arról",
    "attól",
    "az",
    "aznap",
    "azok",
    "azokat",
    "azokba",
    "azokban",
    "azokból",
    "azokhoz",
    "azokig",
    "azokkal",
    "azokká",
    "azoknak",
    "azoknál",
    "azokon",
    "azokra",
    "azokról",
    "azoktól",
    "azokért",
    "azon",
    "azonban",
    "azonnal",
    "azt",
    "aztán",
    "azután",
    "azzal",
    "azzá",
    "azért",
    "bal",
    "balra",
    "ban",
    "be",
    "belé",
    "beléd",
    "beléjük",
    "belém",
    "belénk",
    "belétek",
    "belül",
    "belőle",
    "belőled",
    "belőlem",
    "belőletek",
    "belőlük",
    "belőlünk",
    "ben",
    "benne",
    "benned",
    "bennem",
    "bennetek",
    "bennük",
    "bennünk",
    "bár",
    "bárcsak",
    "bármilyen",
    "búcsú",
    "cikk",
    "cikkek",
    "cikkeket",
    "csak",
    "csakhogy",
    "csupán",
    "de",
    "dehogy",
    "e",
    "ebbe",
    "ebben",
    "ebből",
    "eddig",
    "egy",
    "egyebek",
    "egyebet",
    "egyedül",
    "egyelőre",
    "egyes",
    "egyet",
    "egyetlen",
    "egyik",
    "egymás",
    "egyre",
    "egyszerre",
    "egyéb",
    "együtt",
    "egész",
    "egészen",
    "ehhez",
    "ekkor",
    "el",
    "eleinte",
    "ellen",
    "ellenes",
    "elleni",
    "ellenére",
    "elmondta",
    "elsõ",
    "első",
    "elsők",
    "elsősorban",
    "elsőt",
    "elé",
    "eléd",
    "elég",
    "eléjük",
    "elém",
    "elénk",
    "elétek",
    "elõ",
    "elõször",
    "elõtt",
    "elő",
    "előbb",
    "elől",
    "előle",
    "előled",
    "előlem",
    "előletek",
    "előlük",
    "előlünk",
    "először",
    "előtt",
    "előtte",
    "előtted",
    "előttem",
    "előttetek",
    "előttük",
    "előttünk",
    "előző",
    "emilyen",
    "engem",
    "ennek",
    "ennyi",
    "ennél",
    "enyém",
    "erre",
    "erről",
    "esetben",
    "ettől",
    "ez",
    "ezek",
    "ezekbe",
    "ezekben",
    "ezekből",
    "ezeken",
    "ezeket",
    "ezekhez",
    "ezekig",
    "ezekkel",
    "ezekké",
    "ezeknek",
    "ezeknél",
    "ezekre",
    "ezekről",
    "ezektől",
    "ezekért",
    "ezen",
    "ezentúl",
    "ezer",
    "ezret",
    "ezt",
    "ezután",
    "ezzel",
    "ezzé",
    "ezért",
    "fel",
    "fele",
    "felek",
    "felet",
    "felett",
    "felé",
    "fent",
    "fenti",
    "fél",
    "fölé",
    "gyakran",
    "ha",
    "halló",
    "hamar",
    "hanem",
    "harmadik",
    "harmadikat",
    "harminc",
    "hat",
    "hatodik",
    "hatodikat",
    "hatot",
    "hatvan",
    "helyett",
    "hetedik",
    "hetediket",
    "hetet",
    "hetven",
    "hirtelen",
    "hiszen",
    "hiába",
    "hogy",
    "hogyan",
    "hol",
    "holnap",
    "holnapot",
    "honnan",
    "hova",
    "hozzá",
    "hozzád",
    "hozzájuk",
    "hozzám",
    "hozzánk",
    "hozzátok",
    "hurrá",
    "huszadik",
    "hány",
    "hányszor",
    "hármat",
    "három",
    "hát",
    "hátha",
    "hátulsó",
    "hét",
    "húsz",
    "ide",
    "ide-оda",
    "idén",
    "igazán",
    "igen",
    "ill",
    "ill.",
    "illetve",
    "ilyen",
    "ilyenkor",
    "immár",
    "inkább",
    "is",
    "ismét",
    "ison",
    "itt",
    "jelenleg",
    "jobban",
    "jobbra",
    "jó",
    "jól",
    "jólesik",
    "jóval",
    "jövőre",
    "kell",
    "kellene",
    "kellett",
    "kelljen",
    "keressünk",
    "keresztül",
    "ketten",
    "kettő",
    "kettőt",
    "kevés",
    "ki",
    "kiben",
    "kiből",
    "kicsit",
    "kicsoda",
    "kihez",
    "kik",
    "kikbe",
    "kikben",
    "kikből",
    "kiken",
    "kiket",
    "kikhez",
    "kikkel",
    "kikké",
    "kiknek",
    "kiknél",
    "kikre",
    "kikről",
    "kiktől",
    "kikért",
    "kilenc",
    "kilencedik",
    "kilencediket",
    "kilencet",
    "kilencven",
    "kin",
    "kinek",
    "kinél",
    "kire",
    "kiről",
    "kit",
    "kitől",
    "kivel",
    "kivé",
    "kié",
    "kiért",
    "korábban",
    "képest",
    "kérem",
    "kérlek",
    "kész",
    "késő",
    "később",
    "későn",
    "két",
    "kétszer",
    "kívül",
    "körül",
    "köszönhetően",
    "köszönöm",
    "közben",
    "közel",
    "közepesen",
    "közepén",
    "közé",
    "között",
    "közül",
    "külön",
    "különben",
    "különböző",
    "különbözőbb",
    "különbözőek",
    "lassan",
    "le",
    "legalább",
    "legyen",
    "lehet",
    "lehetetlen",
    "lehetett",
    "lehetőleg",
    "lehetőség",
    "lenne",
    "lenni",
    "lennék",
    "lennének",
    "lesz",
    "leszek",
    "lesznek",
    "leszünk",
    "lett",
    "lettek",
    "lettem",
    "lettünk",
    "lévő",
    "ma",
    "maga",
    "magad",
    "magam",
    "magatokat",
    "magukat",
    "magunkat",
    "magát",
    "mai",
    "majd",
    "majdnem",
    "manapság",
    "meg",
    "megcsinál",
    "megcsinálnak",
    "megint",
    "megvan",
    "mellett",
    "mellette",
    "melletted",
    "mellettem",
    "mellettetek",
    "mellettük",
    "mellettünk",
    "mellé",
    "melléd",
    "melléjük",
    "mellém",
    "mellénk",
    "mellétek",
    "mellől",
    "mellőle",
    "mellőled",
    "mellőlem",
    "mellőletek",
    "mellőlük",
    "mellőlünk",
    "mely",
    "melyek",
    "melyik",
    "mennyi",
    "mert",
    "mi",
    "miatt",
    "miatta",
    "miattad",
    "miattam",
    "miattatok",
    "miattuk",
    "miattunk",
    "mibe",
    "miben",
    "miből",
    "mihez",
    "mik",
    "mikbe",
    "mikben",
    "mikből",
    "miken",
    "miket",
    "mikhez",
    "mikkel",
    "mikké",
    "miknek",
    "miknél",
    "mikor",
    "mikre",
    "mikről",
    "miktől",
    "mikért",
    "milyen",
    "min",
    "mind",
    "mindegyik",
    "mindegyiket",
    "minden",
    "mindenesetre",
    "mindenki",
    "mindent",
    "mindenütt",
    "mindig",
    "mindketten",
    "minek",
    "minket",
    "mint",
    "mintha",
    "minél",
    "mire",
    "miről",
    "mit",
    "mitől",
    "mivel",
    "mivé",
    "miért",
    "mondta",
    "most",
    "mostanáig",
    "már",
    "más",
    "másik",
    "másikat",
    "másnap",
    "második",
    "másodszor",
    "mások",
    "másokat",
    "mást",
    "még",
    "mégis",
    "míg",
    "mögé",
    "mögéd",
    "mögéjük",
    "mögém",
    "mögénk",
    "mögétek",
    "mögött",
    "mögötte",
    "mögötted",
    "mögöttem",
    "mögöttetek",
    "mögöttük",
    "mögöttünk",
    "mögül",
    "mögüle",
    "mögüled",
    "mögülem",
    "mögületek",
    "mögülük",
    "mögülünk",
    "múltkor",
    "múlva",
    "na",
    "nagy",
    "nagyobb",
    "nagyon",
    "naponta",
    "napot",
    "ne",
    "negyedik",
    "negyediket",
    "negyven",
    "neked",
    "nekem",
    "neki",
    "nekik",
    "nektek",
    "nekünk",
    "nem",
    "nemcsak",
    "nemrég",
    "nincs",
    "nyolc",
    "nyolcadik",
    "nyolcadikat",
    "nyolcat",
    "nyolcvan",
    "nála",
    "nálad",
    "nálam",
    "nálatok",
    "náluk",
    "nálunk",
    "négy",
    "négyet",
    "néha",
    "néhány",
    "nélkül",
    "o",
    "oda",
    "ok",
    "olyan",
    "onnan",
    "ott",
    "pedig",
    "persze",
    "pár",
    "például",
    "rajta",
    "rajtad",
    "rajtam",
    "rajtatok",
    "rajtuk",
    "rajtunk",
    "rendben",
    "rosszul",
    "rá",
    "rád",
    "rájuk",
    "rám",
    "ránk",
    "rátok",
    "régen",
    "régóta",
    "részére",
    "róla",
    "rólad",
    "rólam",
    "rólatok",
    "róluk",
    "rólunk",
    "rögtön",
    "s",
    "saját",
    "se",
    "sem",
    "semmi",
    "semmilyen",
    "semmiség",
    "senki",
    "soha",
    "sok",
    "sokan",
    "sokat",
    "sokkal",
    "sokszor",
    "sokáig",
    "során",
    "stb.",
    "szemben",
    "szerbusz",
    "szerint",
    "szerinte",
    "szerinted",
    "szerintem",
    "szerintetek",
    "szerintük",
    "szerintünk",
    "szervusz",
    "szinte",
    "számára",
    "száz",
    "századik",
    "százat",
    "szépen",
    "szét",
    "szíves",
    "szívesen",
    "szíveskedjék",
    "sőt",
    "talán",
    "tavaly",
    "te",
    "tegnap",
    "tegnapelőtt",
    "tehát",
    "tele",
    "teljes",
    "tessék",
    "ti",
    "tied",
    "titeket",
    "tizedik",
    "tizediket",
    "tizenegy",
    "tizenegyedik",
    "tizenhat",
    "tizenhárom",
    "tizenhét",
    "tizenkettedik",
    "tizenkettő",
    "tizenkilenc",
    "tizenkét",
    "tizennyolc",
    "tizennégy",
    "tizenöt",
    "tizet",
    "tovább",
    "további",
    "továbbá",
    "távol",
    "téged",
    "tényleg",
    "tíz",
    "több",
    "többi",
    "többször",
    "túl",
    "tőle",
    "tőled",
    "tőlem",
    "tőletek",
    "tőlük",
    "tőlünk",
    "ugyanakkor",
    "ugyanez",
    "ugyanis",
    "ugye",
    "urak",
    "uram",
    "urat",
    "utoljára",
    "utolsó",
    "után",
    "utána",
    "vagy",
    "vagyis",
    "vagyok",
    "vagytok",
    "vagyunk",
    "vajon",
    "valahol",
    "valaki",
    "valakit",
    "valamelyik",
    "valami",
    "valamint",
    "való",
    "van",
    "vannak",
    "vele",
    "veled",
    "velem",
    "veletek",
    "velük",
    "velünk",
    "vissza",
    "viszlát",
    "viszont",
    "viszontlátásra",
    "volna",
    "volnának",
    "volnék",
    "volt",
    "voltak",
    "voltam",
    "voltunk",
    "végre",
    "végén",
    "végül",
    "által",
    "általában",
    "ám",
    "át",
    "éljen",
    "én",
    "éppen",
    "érte",
    "érted",
    "értem",
    "értetek",
    "értük",
    "értünk",
    "és",
    "év",
    "évben",
    "éve",
    "évek",
    "éves",
    "évi",
    "évvel",
    "így",
    "óta",
    "õ",
    "õk",
    "õket",
    "ön",
    "önbe",
    "önben",
    "önből",
    "önhöz",
    "önnek",
    "önnel",
    "önnél",
    "önre",
    "önről",
    "önt",
    "öntől",
    "önért",
    "önök",
    "önökbe",
    "önökben",
    "önökből",
    "önöket",
    "önökhöz",
    "önökkel",
    "önöknek",
    "önöknél",
    "önökre",
    "önökről",
    "önöktől",
    "önökért",
    "önökön",
    "önön",
    "össze",
    "öt",
    "ötven",
    "ötödik",
    "ötödiket",
    "ötöt",
    "úgy",
    "úgyis",
    "úgynevezett",
    "új",
    "újabb",
    "újra",
    "úr",
    "ő",
    "ők",
    "őket",
    "őt",
];

