#pragma once
#include  "morph_dict/common/utilit.h"

enum NumberFormEnum {
	nfeCardinal = 0,
	nfeOridnal = 1,
	nfeGenitiv = 2
};

struct CNumeralToNumber
{
	std::string	m_Cardinal; // _"два"
	std::string m_Ordinal; // "второй"
	std::string m_Adverb; // "ВДВОЕМ"
	std::string m_CoollectiveNumber; //  "ДВОЕ"
	std::string m_RomanNumber; // II
	double		m_Number; // 2
    bool        m_bNoun; // false
	std::string m_GenitForm; // "двух" (двухламповый)
};

const size_t NumeralToNumberCount = 42;
const CNumeralToNumber NumeralToNumber[NumeralToNumberCount+1] = 
{
{_R("ОДИН"),_R("ПЕРВЫЙ"),"","","I",1,false,_R("ОДНО")}, 
{_R("ПОЛТОРА"),"","","","",1.5,false,_R("ПОЛУТОРО")}, 
{_R("ДВА"),_R("ВТОРОЙ"),_R("ВДВОЕМ"),_R("ДВОЕ"),"II",2,false,_R("ДВУХ")}, 
{_R("ТРИ"),_R("ТРЕТИЙ"),_R("ВТРОЕМ"),_R("ТРОЕ"),"III",3,false,_R("ТРЕХ")}, 
{_R("ЧЕТЫРЕ"),_R("ЧЕТВЕРТЫЙ"),_R("ВЧЕТВЕРОМ"),_R("ЧЕТВЕРО"),"IV",4,false,_R("ЧЕТЫРЕХ")}, 
{_R("ПЯТЬ"),_R("ПЯТЫЙ"),_R("ВПЯТЕРОМ"),_R("ПЯТЕРО"),"V",5,false,_R("ПЯТИ")}, 
{_R("ШЕСТЬ"),_R("ШЕСТОЙ"),_R("ВШЕСТЕРОМ"),_R("ШЕСТЕРО"),"VI",6,false,_R("ШЕСТИ")}, 
{_R("СЕМЬ"),_R("СЕДЬМОЙ"),_R("ВСЕМЕРОМ"),_R("СЕМЕРО"),"VII",7,false,_R("СЕМИ")}, 
{_R("ВОСЕМЬ"),_R("ВОСЬМОЙ"),_R("ВВОСЬМЕРОМ"),_R("ВОСЬМЕРО"),"VIII",8,false,_R("ВОСЕМИ")}, 
{_R("ДЕВЯТЬ"),_R("ДЕВЯТЫЙ"),_R("ВДЕВЯТЕРОМ"),_R("ДЕВЯТЕРО"),"IX",9 ,false,_R("ДЕВЯТИ")}, 
{_R("ДЕСЯТЬ"),_R("ДЕСЯТЫЙ"),_R("ВДЕСЯТЕРОМ"),_R("ДЕСЯТЕРО"),"X",10,false,_R("ДЕСЯТИ")}, 
{_R("ОДИННАДЦАТЬ"),_R("ОДИННАДЦАТЫЙ"),_R("ВОДИННАДЦАТЕРОМ"),"","XI",11,false,_R("ОДИННАДЦАТИ")}, 
{_R("ДВЕНАДЦАТЬ"),_R("ДВЕНАДЦАТЫЙ"), _R("ВДВЕНАДЦАТЕРОМ"),"","XII",12,false,_R("ДВЕНАДЦАТИ")}, 
{_R("ТРИНАДЦАТЬ"),_R("ТРИНАДЦАТЫЙ"), _R("ВТРИНАДЦАТЕРОМ"),"","XIII",13,false,_R("ТРИНАДЦАТИ")}, 
{_R("ЧЕТЫРНАДЦАТЬ"),_R("ЧЕТЫРНАДЦАТЫЙ"),_R("ВЧЕТЫРНАДЦАТЕРОМ"),"","XIV",14,false,_R("ЧЕТЫРНАДЦАТИ")}, 
{_R("ПЯТНАДЦАТЬ"),_R("ПЯТНАДЦАТЫЙ"), _R("ВПЯТНАДЦАТЕРОМ"),"","XV",15,false,_R("ПЯТНАДЦАТИ")}, 
{_R("ШЕСТНАДЦАТЬ"),_R("ШЕСТНАДЦАТЫЙ"), _R("ВШЕСТНАДЦАТЕРОМ"),"","XVI",16,false,_R("ШЕСТНАДЦАТИ")}, 
{_R("СЕМНАДЦАТЬ"),_R("СЕМНАДЦАТЫЙ"), _R("ВСЕМНАДЦАТЕРОМ"),"","XVII",17,false,_R("СЕМНАДЦАТИ")},  
{_R("ВОСЕМНАДЦАТЬ"),_R("ВОСЕМНАДЦАТЫЙ"), _R("ВВОСЕМНАДЦАТЕРОМ"),"","XIII",18,false,_R("ВОСЕМНАДЦАТИ")},  
{_R("ДЕВЯТНАДЦАТЬ"),_R("ДЕВЯТНАДЦАТЫЙ"), _R("ВДЕВЯТНАДЦАТЕРОМ"),"","XIX",19,false,_R("ДЕВЯТНАДЦАТИ")}, 
{_R("ДВАДЦАТЬ"),_R("ДВАДЦАТЫЙ"), _R("ВДВАДЦАТЕРОМ"),"","XX",20,false,_R("ДВАДЦАТИ")}, 
{_R("ТРИДЦАТЬ"),_R("ТРИДЦАТЫЙ"), _R("ВТРИДЦАТЕРОМ"),"","XXX",30,false,_R("ТРИДЦАТИ")}, 
{_R("СОРОК"),_R("СОРОКОВОЙ"), "","","XL",40,false,_R("СОРОКА")}, 
{_R("ПЯТЬДЕСЯТ"),_R("ПЯТИДЕСЯТЫЙ"), _R("ВПЯТИДЕСЯТЕРОМ"),"","L",50,false,_R("ПЯТИДЕСЯТИ")},  
{_R("ШЕСТЬДЕСЯТ"),_R("ШЕСТИДЕСЯТЫЙ"), _R("ВШЕСТИДЕСЯТЕРОМ"),"","LX",60,false,_R("ШЕСТИДЕСЯТИ")}, 
{_R("СЕМЬДЕСЯТ"),_R("СЕМИДЕСЯТЫЙ"), _R("ВСЕМИДЕСЯТЕРОМ"),"","LXX",70,false,_R("СЕМИДЕСЯТИ")},  
{_R("ВОСЕМЬДЕСЯТ"),_R("ВОСЬМИДЕСЯТЫЙ"), _R("ВВОСЬМИДЕСЯТЕРОМ"),"","LXXX",80,false,_R("ВОСЬМИДЕСЯТИ")}, 
{_R("ДЕВЯНОСТО"),_R("ДЕВЯНОСТЫЙ"), "","","XC",90,false,_R("ДЕВЯНОСТО")}, 
{_R("СТО"),_R("СОТЫЙ"),"","","C",100,false,_R("СТО")}, 
{_R("ДВЕСТИ"),_R("ДВУХСОТЫЙ"),"","","CC",200,false,_R("ДВУХСОТ")}, 
{_R("ТРИСТА"),_R("ТРЕХСОТЫЙ"),"","","CCC",300,false,_R("ТРЕХСОТ")}, 
{_R("ЧЕТЫРЕСТА"),_R("ЧЕТЫРЕХСОТЫЙ"),"","CD","I",400,false,_R("ЧЕТЫРЕХСОТ")}, 
{_R("ПЯТЬСОТ"),_R("ПЯТИСОТЫЙ"), "","","D",500,false,_R("ПЯТИСОТ")}, 
{_R("ШЕСТЬСОТ"),_R("ШЕСТИСОТЫЙ"), "","","DC",600,false,_R("ШЕСТИСОТ")}, 
{_R("СЕМЬСОТ"),_R("СЕМИСОТЫЙ"), "","","DCC",700,false,_R("СЕМИСОТ")}, 
{_R("ВОСЕМЬСОТ"),_R("ВОСЬМИСОТЫЙ"), "","","DCCC",800,false,_R("ВОСЬМИСОТ")}, 
{_R("ДЕВЯТЬСОТ"),_R("ДЕВЯТИСОТЫЙ"),"","","CM",900,false,_R("ДЕВЯТИСОТ")}, 
{_R("ТЫСЯЧА"),_R("ТЫСЯЧНЫЙ"),"","","M",1000,true,""}, 
{_R("МИЛЛИОН"),_R("МИЛЛИОННЫЙ"),"","","",1000000,true,""},
{_R("МИЛЛИАРД"),_R("МИЛЛИАРДНЫЙ"),"","","",1000000000,true,""},
{_R("ТРИЛЛИОН"),_R("ТРИЛЛИОННЫЙ"),"","","",1000000000000.0,true,""},
{_R("КВАДРИЛЛИОН"),_R("КВАДРИЛЛИОННЫЙ"),"","","",1000000000000000.0,true,""},
{_R("НОЛЬ"),_R("НУЛЕВОЙ"),"","","",0,true,""} //не должен быть включен в NumeralToNumberCount
};


extern const CNumeralToNumber NumeralToNumber[];

extern std::string IntToStr (double i);
extern std::string FindByNumber(uint64_t Number);
extern int IsAdverbRule(const std::string& Lemma);
extern double GetCardinalNumeral(const std::string& word);
extern double GetOrdinalNumeral(const std::string& word);
extern double GetNounNumeral(const std::string& word);
extern std::string spellout_number_ru(uint64_t x, NumberFormEnum formType);