SHAMSHI_MONTHS = {
    "فروردین": 1,
    "اردیبهشت": 2,
    "خرداد": 3,
    "تیر": 4,
    "مرداد": 5,
    "شهریور": 6,
    "مهر": 7,
    "آبان": 8,
    "ابان": 8,
    "آذر": 9,
    "اذر": 9,
    "دی": 10,
    "بهمن": 11,
    "اسفند": 12
}
GHAMARI_MONTHS = {

    "محرم": 1,
    "صفر": 2,
    "ربیع‌الاول": 3,
    "ربیع الاول": 3,
    "ربیع اول": 3,
    "ربیع‌اول": 3,
    "ریبع‌الاثانی": 4,
    "ربیع الثانی": 4,
    "ربیع الاثانی": 4,
    "ربیع ثانی": 4,
    "جمادی‌الاول": 5,
    "جمادی الاول": 5,
    "جمادی اول": 5,
    "جمادی‌الثانی": 6,
    "جمادی الثانی": 6,
    "جمادی ثانی": 6,
    "رجب": 7,
    "شعبان": 8,
    "رمضان": 9,
    "شوال": 10,
    "ذوالقعده": 11,
    "ذو القعده": 11,
    "ذو قعده": 11,
    "ذی‌القعده": 11,
    "ذی القعده": 11,
    "ذی قعده": 11,
    "ذوالحجه": 12,
    "ذو الحجه": 12,
    "ذو‌الحجه": 12,
    "ذو حجه": 12,
    "ذی الحجه": 12,
    "ذی حجه": 12,
    "ذی‌الحجه ": 12,
    "ذیحجه": 12
}

MILADI_MONTHS = {
    "ژانویه": 1,
    "فوریه": 2,
    "فبریه": 2,
    "مارس": 3,
    "مارچ": 3,
    "آوریل": 4,
    "آپریل": 4,
    "اپریل": 4,
    "اوریل": 4,
    "مه": 5,
    "می": 5,
    "ژوئن": 6,
    "ژوین": 6,
    "ژون": 6,
    "ژوییه": 7,
    "ژوئیه": 7,
    "جولای": 7,
    "اوت": 8,
    "آگوست": 8,
    "اگوست": 8,
    "سپتامبر": 9,
    "سپتامر": 9,
    "اکتبر": 10,
    "نوامبر": 11,
    "دسامبر": 12
}

ONES_TEXT = {
    "صفر": 0,
    "یک": 1,
    "یکم": 1,
    "دو": 2,
    "دوم": 2,
    "سه": 3,
    "سوم": 3,
    "چهار": 4,
    "چهارم": 4,
    "پنج": 5,
    "پنجم": 5,
    "شش": 6,
    "ششم": 6,
    "شیش": 6,
    "شیشم": 6,
    "هفت": 7,
    "هفتم": 7,
    "هشت": 8,
    "هشتم": 8,
    "نه": 9,
    "نهم": 9,
    "دهم": 10,
    "ده": 10
}

ONE_TO_NINE = {
    "یک": 1,
    "دو": 2,
    "سه": 3,
    "چهار": 4,
    "چار": 4,
    "پنج": 5,
    "شش": 6,
    "شیش": 6,
    "هفت": 7,
    "هشت": 8,
    "نه": 9,
}

TENS_TEXT = {
    "بیست": 20,
    "بیستم": 20,
    "سی": 30,
    "چهل": 40,
    "چهلم": 40,
    "پنجاه": 50,
    "پنجاهم": 50,
    "شصت": 60,
    "شصتم": 60,
    "هفتاد": 70,
    "هفتادم": 70,
    "هشتاد": 80,
    "هشتادم": 80,
    "نود": 90,
    "نودم": 90,
}

TEN_PLUS_TEXT = {
    "یازده": 11,
    "یازدهم": 11,
    "دوازده": 12,
    "دوازدهم": 12,
    "سیزده": 13,
    "سیزدهم": 13,
    "چهارده": 14,
    "چهاردهم": 14,
    "پانزده": 15,
    "پانزدهم": 15,
    "شانزده": 16,
    "شانزدهم": 16,
    "هفده": 17,
    "هفدهم": 17,
    "هجده": 18,
    "هجدهم": 18,
    "نوزده": 19,
    "نوزدهم": 19,
}

HUNDREDS_TEXT = {
    "یکصد": 100,
    "صد": 100,
    "دویست": 200,
    "سیصد": 300,
    "چهارصد": 400,
    "پانصد": 500,
    "ششصد": 600,
    "شیشصد": 600,
    "هفتصد": 700,
    "هشتصد": 800,
    "نهصد": 900,
}

TYPO_HUNDREDS_TEXT = {
    "یکصد": 100,
    "صد": 100,
    "دویست": 200,
    "سیصد": 300,
    "سی صد": 300,
    "سی‌صد": 300,
    "چهارصد": 400,
    "چهار‌صد": 400,
    "چهار صد": 400,
    "پانصد": 500,
    "پونصد": 500,
    "ششصد": 600,
    "شیشصد": 600,
    "شش صد": 600,
    "شیش صد": 600,
    "شش‌صد": 600,
    "شیش‌صد": 600,
    "هفتصد": 700,
    "هفت صد": 700,
    "هفت‌صد": 700,
    "هشتصد": 800,
    "هشت صد": 800,
    "هشت‌صد": 800,
    "نهصد": 900,
    "نه صد": 900,
    "نه‌صد": 900
}

MAGNITUDE = {
    "هزار": 1000,
    "میلیون": 1000000,
    "بیلیون": 1000000000,
    "میلیارد": 1000000000,
    "تریلیون": 1000000000000,
}

TYPO_LIST = {
    "سی ام": "سی",
    "سی‌ام": "سی",
    "شیش صد": "ششصد",
    "شش صد": "ششصد",
    "هفت صد": "هفتصد",
    "هشت صد": "هشتصد",
    "نه صد": "نهصد",
}

FA_TO_EN = {
    "۰": "0",
    "۱": "1",
    "۲": "2",
    "۳": "3",
    "۴": "4",
    "۵": "5",
    "۶": "6",
    "۷": "7",
    "۸": "8",
    "۹": "9"
}

MINUTES = {
    "صفر": 0,
    "یک": 1,
    "دو": 2,
    "سه": 3,
    "چهار": 4,
    "پنج": 5,
    "شش": 6,
    "شیش": 6,
    "هفت": 7,
    "هشت": 8,
    "نه": 9,
    "ده": 10,
    "یازده": 11,
    "دوازده": 12,
    "سیزده": 13,
    "سینزده": 13,
    "چهارده": 14,
    "چارده": 14,
    "پانزده": 15,
    "پونزده": 15,
    "شانزده": 16,
    "شونزده": 16,
    "هفده": 17,
    "هیفده": 17,
    "هجده": 18,
    "هیجده": 18,
    "نونزده": 19,
    "نوزده": 19,
    "بیست": 20,
    "بیست یک": 21,
    "بیست و یک": 21,
    "بیست دو": 22,
    "بیست و دو": 22,
    "بیست سه": 23,
    "بیست و سه": 23,
    "بیست چار": 24,
    "بیست چهار": 24,
    "بیست و چهار": 24,
    "بیست و چار": 24,
    "بیست پنچ": 25,
    "بیست و پنج": 26,
    "بیست شش": 26,
    "بیست و شش": 26,
    "بیست و شیش": 26,
    "بیست هفت": 27,
    "بیست و هفت": 27,
    "بیست هشت": 28,
    "بیست و هشت": 28,
    "بیست و نه": 29,
    "بیست نه": 29,
    "سی": 30,
    "سی یک": 31,
    "سی و یک": 31,
    "سی دو": 32,
    "سی و دو": 32,
    "سی سه": 33,
    "سی و سه": 33,
    "سی چهار": 34,
    "سی چار": 34,
    "سی و چهار": 34,
    "سی و چار": 34,
    "سی پنج": 35,
    "سی و پنج": 35,
    "سی شش": 36,
    "سی شیش": 36,
    "سی و شش": 36,
    "سی و شیش": 36,
    "سی هفت": 37,
    "سی و هفت": 37,
    "سی هشت": 38,
    "سی و هشت": 38,
    "سی نه": 39,
    "سی و نه": 39,
    "چهل": 40,
    "چهل یک": 41,
    "چهل و یک": 41,
    "چهل دو": 42,
    "چهل و دو": 42,
    "چهل سه": 43,
    "چهل و سه": 43,
    "چهل چهار": 44,
    "چهل چار": 44,
    "چهل و چهار": 44,
    "چهل و چار": 44,
    "چهل پنج": 45,
    "چهل و پنج": 45,
    "چهل شش": 46,
    "چهل شیش": 46,
    "چهل و شش": 46,
    "چهل و شیش": 46,
    "چهل هفت": 47,
    "چهل و هفت": 47,
    "چهل هشت": 48,
    "چهل و هشت": 48,
    "چهل نه": 49,
    "چهل و نه": 49,
    "پنجاه": 50,
    "پنجا": 50,
    "پنجاه یک": 51,
    "پنجاه و یک": 51,
    "پنجا و یک": 51,
    "پنجاه دو": 52,
    "پنجاه و دو": 52,
    "پنجا و دو": 52,
    "پنجاه سه": 53,
    "پنجاه و سه": 53,
    "پنجا و سه": 53,
    "پنجاه چهار": 54,
    "پنجاه چار": 54,
    "پنجاه و چهار": 54,
    "پنجاه و چار": 54,
    "پنجا و چهار": 54,
    "پنجا و چار": 54,
    "پنجاه پنج": 55,
    "پنجاه و پنج": 55,
    "پنجا و پنج": 55,
    "پنجاه شش": 56,
    "پنجاه شیش": 56,
    "پنجاه و شش": 56,
    "پنجاه و شیش": 56,
    "پنجا و شش": 56,
    "پنجا و شیش": 56,
    "پنجاه هفت": 57,
    "پنجاه و هفت": 57,
    "پنجا و هفت": 57,
    "پنجاه هشت": 58,
    "پنجاه و هشت": 58,
    "پنجا و هشت": 58,
    "پنجاه و نه": 59,
    "پنجا و نه": 59,
    "پنجاه نه": 59
}

ONE_NINETY_NINE = {
    "یک": 1,
    "دو": 2,
    "سه": 3,
    "چهار": 4,
    "پنج": 5,
    "شش": 6,
    "شیش": 6,
    "هفت": 7,
    "هشت": 8,
    "نه": 9,
    "ده": 10,
    "یازده": 11,
    "دوازده": 12,
    "سیزده": 13,
    "سینزده": 13,
    "چهارده": 14,
    "چارده": 14,
    "پانزده": 15,
    "پونزده": 15,
    "شانزده": 16,
    "شونزده": 16,
    "هفده": 17,
    "هیفده": 17,
    "هجده": 18,
    "هیجده": 18,
    "نونزده": 19,
    "نوزده": 19,
    "بیست": 20,
    "بیست یک": 21,
    "بیست و یک": 21,
    "بیست دو": 22,
    "بیست و دو": 22,
    "بیست سه": 23,
    "بیست و سه": 23,
    "بیست چار": 24,
    "بیست چهار": 24,
    "بیست و چهار": 24,
    "بیست و چار": 24,
    "بیست پنچ": 25,
    "بیست و پنج": 26,
    "بیست شش": 26,
    "بیست و شش": 26,
    "بیست و شیش": 26,
    "بیست هفت": 27,
    "بیست و هفت": 27,
    "بیست هشت": 28,
    "بیست و هشت": 28,
    "بیست و نه": 29,
    "بیست نه": 29,
    "سی": 30,
    "سی یک": 31,
    "سی و یک": 31,
    "سی دو": 32,
    "سی و دو": 32,
    "سی سه": 33,
    "سی و سه": 33,
    "سی چهار": 34,
    "سی چار": 34,
    "سی و چهار": 34,
    "سی و چار": 34,
    "سی پنج": 35,
    "سی و پنج": 35,
    "سی شش": 36,
    "سی شیش": 36,
    "سی و شش": 36,
    "سی و شیش": 36,
    "سی هفت": 37,
    "سی و هفت": 37,
    "سی هشت": 38,
    "سی و هشت": 38,
    "سی نه": 39,
    "سی و نه": 39,
    "چهل": 40,
    "چهل یک": 41,
    "چهل و یک": 41,
    "چهل دو": 42,
    "چهل و دو": 42,
    "چهل سه": 43,
    "چهل و سه": 43,
    "چهل چهار": 44,
    "چهل چار": 44,
    "چهل و چهار": 44,
    "چهل و چار": 44,
    "چهل پنج": 45,
    "چهل و پنج": 45,
    "چهل شش": 46,
    "چهل شیش": 46,
    "چهل و شش": 46,
    "چهل و شیش": 46,
    "چهل هفت": 47,
    "چهل و هفت": 47,
    "چهل هشت": 48,
    "چهل و هشت": 48,
    "چهل نه": 49,
    "چهل و نه": 49,
    "پنجاه": 50,
    "پنجا": 50,
    "پنجاه یک": 51,
    "پنجاه و یک": 51,
    "پنجا و یک": 51,
    "پنجاه دو": 52,
    "پنجاه و دو": 52,
    "پنجا و دو": 52,
    "پنجاه سه": 53,
    "پنجاه و سه": 53,
    "پنجا و سه": 53,
    "پنجاه چهار": 54,
    "پنجاه چار": 54,
    "پنجاه و چهار": 54,
    "پنجاه و چار": 54,
    "پنجا و چهار": 54,
    "پنجا و چار": 54,
    "پنجاه پنج": 55,
    "پنجاه و پنج": 55,
    "پنجا و پنج": 55,
    "پنجاه شش": 56,
    "پنجاه شیش": 56,
    "پنجاه و شش": 56,
    "پنجاه و شیش": 56,
    "پنجا و شش": 56,
    "پنجا و شیش": 56,
    "پنجاه هفت": 57,
    "پنجاه و هفت": 57,
    "پنجا و هفت": 57,
    "پنجاه هشت": 58,
    "پنجاه و هشت": 58,
    "پنجا و هشت": 58,
    "پنجاه و نه": 59,
    "پنجا و نه": 59,
    "پنجاه نه": 59,
    "شصت": 60,
    "شصت و یک": 61,
    "شصت و دو": 62,
    "شصت و سه": 63,
    "شصت و چهار": 64,
    "شصت و پنج": 65,
    "شصت و شش": 66,
    "شصت و هفت": 67,
    "شصت و هشت": 68,
    "شصت و نه": 69,
    "هفتاد": 70,
    "هفتاد و یک": 71,
    "هفتاد و دو": 72,
    "هفتاد و سه": 73,
    "هفتاد و چهار": 74,
    "هفتاد و پنج": 75,
    "هفتاد و شش": 76,
    "هفتاد و هفت": 77,
    "هفتاد و هشت": 78,
    "هفتاد و نه": 79,
    "هشتاد": 80,
    "هشتاد و یک": 81,
    "هشتاد و دو": 82,
    "هشتاد و سه": 83,
    "هشتاد و چهار": 84,
    "هشتاد و پنج": 85,
    "هشتاد و شش": 86,
    "هشتاد و هفت": 87,
    "هشتاد و هشت": 88,
    "هشتاد و نه": 89,
    "نود": 90,
    "نود و یک": 91,
    "نود و دو": 92,
    "نود و سه": 93,
    "نود و چهار": 94,
    "نود و پنج": 95,
    "نود و شش": 96,
    "نود و هفت": 97,
    "نود و هشت": 98,
    "نود و نه": 99
}

TEN_NINETY_NINETEEN = {
    "ده": 10,
    "یازده": 11,
    "دوازده": 12,
    "سیزده": 13,
    "سینزده": 13,
    "چهارده": 14,
    "چارده": 14,
    "پانزده": 15,
    "پونزده": 15,
    "شانزده": 16,
    "شونزده": 16,
    "هفده": 17,
    "هیفده": 17,
    "هجده": 18,
    "هیجده": 18,
    "نونزده": 19,
    "نوزده": 19
}

HOUR_PART = {
    "ربع": 15,
    "نیم": 30
}

FA_NUMBERS = "۰|۱|۲|۳|۴|۵|۶|۷|۸|۹"

EN_NUMBERS = "0|1|2|3|4|5|6|7|8|9"

Symbols = ":|/|-"

JOINER = "و"

FA_ALPHABET = '\u0621-\u0628\u062A-\u063A\u0641-\u0642\u0644-\u0648\u064E-\u0651\u0655\u067E\u0686\u0698\u06A9\u06AF\u06BE\u06CC'
FA_PUNCT = '\u060C\u061B\u061F\u0640\u066A\u066B\u066C'
FA_NUM = '\u06F0-\u06F9'
FA_SYM = fr"[{FA_ALPHABET}{FA_PUNCT}{FA_NUM}]"

# supports persian numbers from one to four digits written with persian alphabet
# example:  هزار و سیصد و شصت و پنج

TENS_NUMBER = {
    "بیست": 20,
    "سی": 30,
    "چهل": 40,
    "پنجاه": 50,
    "شصت": 60,
    "هفتاد": 70,
    "هشتاد": 80,
    "نود": 90
}

WHITE_SPACE = u'[\u200c\\\s]{0,2}'
# اعداد یک تا نه
ONE_TO_NINE_JOIN = "|".join(ONE_TO_NINE.keys())
# بیست سی چهل ...
TENS_NUMBER_JOIN = "|".join(TENS_NUMBER.keys())
# اعداد یک تا نوزده
TEN_TO_NINETEEN_JOIN = "|".join(list(TEN_NINETY_NINETEEN.keys())[::-1])
# هزار میلیون بیلیون ...
MAGNITUDE_JOIN = "|".join(MAGNITUDE.keys())

HEZAR = "هزار"

# یکصد دویست ...
HUNDREDS_TEXT_JOIN = "|".join(TYPO_HUNDREDS_TEXT.keys())

# اعداد یک تا نود و نه
ONE_NINETY_NINE_JOIN = "|".join(list(ONE_NINETY_NINE.keys())[::-1])

# ربع و نیم
FDIGIT = f"(?:{WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}(?:{'|'.join(HOUR_PART.keys())}))?"

# ONE DIGIT NUMBERS
DIGIT1 = f"(?:{ONE_TO_NINE_JOIN})"

DBTW10_19 = f"(?:{TEN_TO_NINETEEN_JOIN})"
DECIMAL = f"(?:{TENS_NUMBER_JOIN})"
DBTW21_99_EXC_DECIMAL = f"(?:{DECIMAL}{WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}{DIGIT1})"

# TWO DIGIT NUMBERS
DIGIT2 = DBTW21_99_EXC_DECIMAL + "|" + DBTW10_19 + "|" + DECIMAL

HUNDREDS = f"(?:{HUNDREDS_TEXT_JOIN})"
DBTW101_999_EXC_HUNDREDS = f"(?:{HUNDREDS}{WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}(?:{DIGIT2}|{DIGIT1}))"

# THREE DIGIT NUMBERS
DIGIT3 = DBTW101_999_EXC_HUNDREDS + "|" + HUNDREDS

S_HEZAR = f"(?:{DIGIT1}){WHITE_SPACE}{HEZAR}"
THOUSAND = f"(?:{HEZAR}){WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}(?:{DIGIT3}|{DIGIT2}|{DIGIT1})"
DBTW1001_9999_EXC_THOUSANDS = f"(?:{S_HEZAR}){WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}(?:{DIGIT3}|{DIGIT2}|{DIGIT1})"

# FOUR DIGIT NUMBERS
DIGIT4 = DBTW1001_9999_EXC_THOUSANDS + "|" + THOUSAND + "|" + S_HEZAR

# LARGE NUMBERS
L_HEZAR = f"(?:{DIGIT3}|{DIGIT2}|{DIGIT1}){WHITE_SPACE}{HEZAR}"
L_HEZAR_DIGITS = f"(?:{L_HEZAR}){WHITE_SPACE}(?:{JOINER}){WHITE_SPACE}(?:{DIGIT3}|{DIGIT2}|{DIGIT1})"
DIGITPLUS = L_HEZAR_DIGITS + "|" + L_HEZAR

# NUMBERS WITHING 0 TO 9999
DSMALL = f"(?:{DIGIT4}|{DIGIT3}|{DIGIT2}|{DIGIT1}|{MAGNITUDE_JOIN}){FDIGIT}"

# ANY NUMBER (DO NOT USE IT UNLESS U MEAN IT)
DLARGE = f"(?:{DIGITPLUS}|{DIGIT4}|{DIGIT3}|{DIGIT2}|{DIGIT1}|{MAGNITUDE_JOIN}){FDIGIT}(?:{WHITE_SPACE}(?:{MAGNITUDE_JOIN}))?"
