#pragma once

namespace xtr::encode {

//! Unicode math symbols enumerations
enum UTF8Codes : wchar_t {
  US_LOGIC_NOT = 0xAC,        //отрицание
  US_CARTH = 0xD7,            //декартово произведение
  US_BOOL = 0x212C,             //булеан
  US_A = 0x03B1,                //альфа
  US_B = 0x03B2,                //бэта
  US_G = 0x03B3,                //гамма
  US_D = 0x03B4,                //дельта
  US_E = 0x03B5,                //экпсилон
  US_Z = 0x03B6,                //зетта
  US_H = 0x03B7,                //эта
  US_V = 0x03B8,                //тэта
  US_L = 0x03BB,                //лямбда
  US_M = 0x03BC,                //мю
  US_N = 0x03BD,                //ню
  US_X = 0x03BE,                //кси
  US_O = 0x03BF,                //о
  US_P = 0x03C0,                //пи
  US_R = 0x03C1,                //ро
  US_S = 0x03C3,                //сигма
  US_T = 0x03C4,                //тау
  US_Q = 0x03C5,                //ипсилон
  US_F = 0x03C6,                //фи
  US_C = 0x03C7,                //хи
  US_J = 0x03C8,                //пси
  US_W = 0x03C9,                //омега
  US_DIGIT_SUB0 = 0x2080,       // 0
  US_DIGIT_SUB1 = 0x2081,       // 1
  US_DIGIT_SUB2 = 0x2082,       // 2
  US_DIGIT_SUB3 = 0x2083,       // 3
  US_DIGIT_SUB4 = 0x2084,       // 4
  US_DIGIT_SUB5 = 0x2085,       // 5
  US_DIGIT_SUB6 = 0x2086,       // 6
  US_DIGIT_SUB7 = 0x2087,       // 7
  US_DIGIT_SUB8 = 0x2088,       // 8
  US_DIGIT_SUB9 = 0x2089,       // 9
  US_INTEGERS = 0x2102,         //множество целых чисел
  US_NATURALS = 0x2115,         //множество натуральных чисел
  US_REALS = 0x211D,            //множество действительных чисел
  US_IMPLICATION = 0x21D2,      //импликация
  US_LOGIC_EQUAL = 0x21D4,      //тогда и только тогда
  US_LOGIC_FORALL = 0x2200,     //для любого
  US_LOGIC_EXISTS = 0x2203,     //существует
  US_EMPTYSET = 0x2205,         //пустое множество
  US_ELEMENT = 0x2208,          //принадлежность
  US_NOTELEMENT = 0x2209,       //не принадлежность
  US_MINUS = 0x2212,            //минус
  US_INFINITY = 0x221E,         //бесконечность
  US_SET_UNION = 0x222A,        //объединение
  US_SET_SYMMINUS = 0x2206,     //симметрическая разность
  US_LOGIC_OR = 0x2228,         //или
  US_SET_INTERSECTION = 0x2229, //пересечение
  US_NOTEQUAL = 0x2260,         //не равно
  US_GREATER_OR_EQ = 0x2265,    //больше или равно
  US_LESSER_OR_EQ = 0x2264,     //меньше или равно
  US_IDENTITY = 0x2261,         //тождественно равно
  US_SUBSET = 0x2282,           //включение
  US_NOTSUBSET = 0x2284,        //не включение
  US_SUBSET_OR_EQ = 0x2286      //нестрогое включение
};

constexpr bool IsGreek(const wchar_t uc) noexcept {
  return uc >= US_A && uc <= US_W;
}

constexpr bool IsIndex(const wchar_t uc) noexcept {
  return
    (uc >= US_DIGIT_SUB0 && uc <= US_DIGIT_SUB9) ||
    (uc >= '0' && uc <= '9');
}

bool IsCstName(wchar_t uc) noexcept;
bool IsAlphaNumber(wchar_t uc) noexcept;

wchar_t Bulean2ToUnicodeChar(wchar_t ac);

void EncodeToUnicode(CString& str);

uint8_t Encode1251To866(uint8_t c) noexcept;

}  // namespace xtr::encode