import re
import string

import emoji


NON_PRINTING_CHARACTERS_RE = re.compile(f"[{''.join(map(chr, list(range(0,32)) + list(range(127,160))))}]")

DIGITS_RE = re.compile(r"\d")

UNICODE_PUNCTUATION = {
    "，": ",",
    "。": ".",
    "、": ",",
    "„": '"',
    "”": '"',
    "“": '"',
    "«": '"',
    "»": '"',
    "１": '"',
    "」": '"',
    "「": '"',
    "《": '"',
    "》": '"',
    "´": "'",
    "∶": ":",
    "：": ":",
    "？": "?",
    "！": "!",
    "（": "(",
    "）": ")",
    "；": ";",
    "–": "-",
    "—": " - ",
    "．": ". ",
    "～": "~",
    "’": "'",
    "…": "...",
    "━": "-",
    "〈": "<",
    "〉": ">",
    "【": "[",
    "】": "]",
    "％": "%",
    "►": "-",
}

main_special_characters = string.punctuation + string.digits + string.whitespace
other_special_characters = (
    "    　    ￼’“”–ー一▬…✦�­£​•€«»°·═"
    "×士＾˘⇓↓↑←→（）§″′´¿−±∈﻿¢ø‚„½¼¾¹²³―⁃，ˌ¸‹›ʺˈʻ¦‐⠀‰‑≤≥‖"
    "◆●■►▼▲▴∆▻¡★☆✱ːº。¯˜¥ɪ≈†上ン：∼⁄・♡✓⊕․．⋅÷１‟；،、¨ाাी्े◦˚"
    "゜ʼ≖ʼ¤ッツシ℃√！【】‿∞➤～πه۩☛₨➩☻๑٪♥ıॽ《‘©﴿٬？▷Г♫∟™ª₪®「—❖"
    "」﴾》"
)
emoji = list(emoji.UNICODE_EMOJI["en"].keys())
SPECIAL_CHARACTERS = set(main_special_characters + other_special_characters)
SPECIAL_CHARACTERS.update(emoji)

STOPWORDS = [
    "a",
    "a.k.a",
    "aboard",
    "about",
    "above",
    "abt",
    "accord",
    "according",
    "across",
    "after",
    "against",
    "ago",
    "aground",
    "ahead",
    "aka",
    "ala",
    "albeit",
    "all",
    "along",
    "alongside",
    "although",
    "am",
    "amid",
    "amidst",
    "among",
    "amongst",
    "amoung",
    "an",
    "and",
    "and/or",
    "another",
    "any",
    "any1",
    "anybody",
    "anyone",
    "anything",
    "are",
    "around",
    "as",
    "aside",
    "astride",
    "at",
    "atop",
    "away",
    "b",
    "b/c",
    "b/t",
    "back",
    "base",
    "based",
    "bc",
    "be",
    "because",
    "been",
    "before",
    "behind",
    "being",
    "below",
    "beneath",
    "beside",
    "besides",
    "between",
    "beyond",
    "board",
    "both",
    "btwn",
    "but",
    "by",
    "can",
    "cause",
    "circa",
    "cos",
    "could",
    "coz",
    "cus",
    "depend",
    "depending",
    "despite",
    "did",
    "do",
    "does",
    "down",
    "due",
    "during",
    "each",
    "either",
    "else",
    "even",
    "ever",
    "every",
    "everybody",
    "everyone",
    "everything",
    "except",
    "for",
    "forth",
    "from",
    "get",
    "gets",
    "getting",
    "give",
    "given",
    "got",
    "had",
    "half",
    "has",
    "hav",
    "have",
    "having",
    "he",
    "her",
    "hers",
    "herself",
    "him",
    "himself",
    "his",
    "how",
    "however",
    "i",
    "i'd",
    "if",
    "in",
    "include",
    "including",
    "inside",
    "instead",
    "into",
    "is",
    "it",
    "it's",
    "its",
    "itself",
    "lest",
    "like",
    "made",
    "many",
    "may",
    "me",
    "might",
    "mine",
    "minus",
    "most",
    "much",
    "must",
    "my",
    "myself",
    "nary",
    "near",
    "nearby",
    "neither",
    "next",
    "nigh",
    "no",
    "nobody",
    "none",
    "noone",
    "nor",
    "not",
    "nothing",
    "notwithstanding",
    "of",
    "off",
    "on",
    "onboard",
    "once",
    "one",
    "ones",
    "oneself",
    "only",
    "onto",
    "opposite",
    "or",
    "other",
    "others",
    "ought",
    "our",
    "ours",
    "ourselves",
    "out",
    "outside",
    "over",
    "overt",
    "own",
    "past",
    "per",
    "plus",
    "prior",
    "quite",
    "rather",
    "re",
    "regard",
    "regarding",
    "regardless",
    "round",
    "s/he",
    "save",
    "self",
    "shall",
    "she",
    "should",
    "side",
    "since",
    "so",
    "some",
    "somebody",
    "someone",
    "something",
    "such",
    "sure",
    "teh",
    "than",
    "thanks",
    "that",
    "the",
    "their",
    "theirs",
    "them",
    "themselves",
    "then",
    "there",
    "these",
    "they",
    "they're",
    "thier",
    "this",
    "tho",
    "those",
    "thou",
    "though",
    "through",
    "throughout",
    "thru",
    "thy",
    "til",
    "till",
    "to",
    "together",
    "too",
    "toward",
    "towards",
    "u",
    "under",
    "underneath",
    "unless",
    "unlike",
    "until",
    "unto",
    "up",
    "upon",
    "ur",
    "us",
    "use",
    "versus",
    "via",
    "vs",
    "vs.",
    "w/",
    "w/o",
    "w/out",
    "was",
    "we",
    "were",
    "what",
    "whatever",
    "whatnot",
    "when",
    "whenever",
    "where",
    "whereas",
    "wherever",
    "whether",
    "which",
    "while",
    "whilst",
    "whither",
    "who",
    "who's",
    "whoever",
    "whom",
    "whomever",
    "whose",
    "why",
    "will",
    "with",
    "within",
    "without",
    "wo",
    "worth",
    "would",
    "wud",
    "y'all",
    "ya",
    "yet",
    "yo",
    "you",
    "you're",
    "your",
    "youre",
    "yours",
    "yourself",
    "yourselves",
]
STOPWORDS = set(STOPWORDS)

FLAGGED_WORDS = [
    "anal",
    "bareback",
    "bbw",
    "bdsm",
    "blowjob",
    "blowjobs",
    "brazzers",
    "bukkake",
    "camgirl",
    "camwhore",
    "cocksucking",
    "creampie",
    "cuckold",
    "cum",
    "cumming",
    "cums",
    "cumshot",
    "cumshots",
    "cumslut",
    "cunnilingus",
    "deepthroat",
    "deepthroating",
    "dildo",
    "dildos",
    "dogging",
    "doggystyle",
    "dominatrix",
    "erotic",
    "fellatio",
    "femdom",
    "fingering",
    "fisting",
    "footjob",
    "gangbang",
    "handjob",
    "hentai",
    "horney",
    "horniest",
    "horny",
    "jism",
    "jizz",
    "masterbating",
    "masturbate",
    "masturbating",
    "masturbation",
    "milf",
    "orgies",
    "orgy",
    "pegging",
    "porn",
    "pornhub",
    "porno",
    "pornos",
    "pornstar",
    "pornstars",
    "redtube",
    "rimming",
    "slutty",
    "squirting",
    "strapon",
    "threesome",
    "vibrator",
    "xhamster",
    "xnxx",
    "xvideos",
    "xxx",
    "youporn",
]
FLAGGED_WORDS = set(FLAGGED_WORDS)

PUNCTUATION = set([",", ";", ":", "?", "!", "."])
