from .features import Dictionary, RegexMatches, Stemmed, Stopwords

name = "portuguese"

try:
    import enchant
    dictionary = enchant.Dict("pt")
except enchant.errors.DictNotFoundError:
    raise ImportError("No enchant-compatible dictionary found for 'pt'.  " +
                      "Consider installing 'myspell-pt'.")

dictionary = Dictionary(name + ".dictionary", dictionary.check)
"""
:class:`~revscoring.languages.features.Dictionary` features via
:class:`enchant.Dict` "pt". Provided by `myspell-pt`
"""

try:
    from nltk.corpus import stopwords as nltk_stopwords
    stopwords = set(nltk_stopwords.words('portuguese'))
except LookupError:
    raise ImportError("Could not load stopwords for {0}. ".format(__name__) +
                      "You may need to install the nltk 'stopwords' " +
                      "corpora.  See http://www.nltk.org/data.html")

stopwords = Stopwords(name + ".stopwords", stopwords)
"""
:class:`~revscoring.languages.features.Stopwords` features provided by
:func:`nltk.corpus.stopwords` "portuguese"
"""

try:
    from nltk.stem.snowball import SnowballStemmer
    stemmer = SnowballStemmer("portuguese")
except ValueError:
    raise ImportError("Could not load stemmer for {0}. ".format(__name__))

stemmed = Stemmed(name + ".stemmed", stemmer.stem)
"""
:class:`~revscoring.languages.features.Stemmed` word features via
:class:`nltk.stem.snowball.SnowballStemmer` "portuguese"
"""

badword_regexes = [
    r"baba[ckq](as?|ão|ões|u?i[cçs]s?e)",  # douchebag
    r"bi(ch|x)as?",  # gay man
    r"boio(l[ai](tico)?|l[aã]o|lo(go|[gj]i[sx]ta))s?",  # gay man
    r"bo(qu|k)etes?",  # blowjob
    r"bo[sx]t(ao?s?|alhao?)",  # shit
    r"b[uo]s?[cçs]s?et+(a[os]?|inha)?",  # pussy (vagina)
    r"bu[mn]d((inh)?as?|[ãa]o)",  # ass
    r"b[uo]rr[oaei](ce|[ius])?",  # donkey/jackass
    r"[ck]a[csç]s?ete?s?",  # bludgeon
    # shit
    r"[ck]ag(a(r|n?do|dao?|n?ei(r[ao])?|(lh)?a?o|nitas?|dela|lhoto)?|ou)",
    r"[ck]ara(l?hl?([ou]?s?|ao|inh[ou]s?)|i([ou]s?)?)",  # fuck
    r"(ch|x)at[ao]s?",  # boring
    r"(ch|x)up[aeiou]([dv]a|te|nha|ndo|r|u)?",  # blow me
    r"[ck]o[ck]ô",  # poo
    r"[ck]om(er?|i)",  # fucked
    r"[ck]onas?",  # cunt
    r"[ck]uz([aã]o|inho)",  # asshole
    r"doid(inh)?[ao]s?",  # crazy
    r"fed?(id?[ao]|e|orent[ao])s?",  # stinks/stinky
    r"fei[ao]s?",  # ugly
    r"fendi",  # ???
    r"f[ou]d(a[os]?|e[ru]?|idos?)",  # fuck
    r"go[sx]tos([ao]s?|ão|ões|onas?)",  # hot
    r"idiot(a|i[cçs]s?e)s?",  # idiot
    r"lo(k[oa]s?|u[ck]([oa]s?|ura|a(mente)?))",  # crazy
    r"maconheir[ao]s?",  # bothead
    r"m[áa]fia",  # mafia
    r"maldizentes",  # slanderers
    r"mecos",  # cum ???
    r"mentir(a|os[oa])s?",  # lie/liar
    r"merd(a|[ãa]o|oso|ica)s?",  # shit
    r"noob",  # noob
    r"ot[áa]ri[oa]s?",  # sucker
    r"pari[ou]",  # part of "puta que o pariu"
    r"pategos",  # hick / yokel
    r"pau",  # dick
    r"peid([ao]|[ãa]o|ei|ar(ia)?|ando|aç[oa])s?",  # fart
    r"p[êe]nis+",  # penis
    r"pilas?",  # dick
    r"piroca",  # dick
    r"porcaria", r"porn[ôo]?",  # filth/porn
    r"po(rr|h)a",  # cum
    r"pum",  # fart
    r"punhet(a|eir[oa])s?",  # jack off / masturbate
    r"put([ao]|[ao]na|aria|eiro|inha)s?",  # bitch/hooker
    r"safad([ao]|ona)s?",  # shameless
    r"te[sz]ão", r"te[sz]ud[oa]s?",  # turn-on / horny
    r"tran[sz]([aá](r(am)?|n?do)?|ou)",  # sex
    r"tretas?",  # bullshit
    r"trou?(ch|x)as?",
    r"vadi([ao]s?|agem)",  # bitch
    r"viad(agem?|[aã]?o|inh[ou])s?",  # gay person ("fucker")
    r"xixi"  # pee
]

badwords = RegexMatches(name + ".badwords", badword_regexes)
"""
:class:`~revscoring.languages.features.RegexMatches` features via a list of
badword detecting regexes.
"""

informal_regexes = [
    r"adoro",  # love
    r"aki",  # here
    r"amo",  # master
    r"(b+l+a+h*)+",  # bla, blah, bbblllaaaahhhhhblah
    r"carambas?",  # OMG
    r"coco",  # coconut
    r"copie[im]",  # I copied
    r"delicia",  # delicious
    r"editei",  # edited
    r"enfiar?",  # to stick (up one's ass)
    r"entao",  # then
    r"estrag(ar|uem)",  # spoiled / ruined
    r"fixe",  # cool
    r"gajo",  # dude
    r"h[aiou](h[aeiou])*", r"h[e](h[aeiou])+",  # hi, ha, hehe, hohoho
    r"k+",  # k, kkkkkkkkkkkkkkk
    r"lindo",  # pretty
    r"l+([uo]+l+)+",  # lol, LOLOLOL, LLLLoOOoLLL
    r"mae",  # mom
    r"mto",  # very
    r"naum",  # no (slang)
    r"n[óo]is",  # it's us (slang)
    r"odeio",  # hate
    r"oi+",  # hi
    r"ol[aá]",  # hello
    r"ratas?",  # "rat" -- a snitch
    r"(rs)+",  # lol
    r"tava",  # was / were (slang)
    r"tbm",  # also (slang)
    r"vao",  # vain
    r"vcs", r"voce", r"voces",  # you
    r"xau"  # bye
]

informals = RegexMatches(name + ".informals", informal_regexes)
"""
:class:`~revscoring.languages.features.RegexMatches` features via a list of
informal word detecting regexes.
"""
