#ifndef TOKEN_H
#define TOKEN_H

#include <string>
#include <vector>
#include <map>

class Tokenizer {
public:
    std::map<std::string, int> wordToId;
    std::map<int, std::string> idToWord;

    Tokenizer() {
        add("[EOS]"); add("[SYS]"); add("[USER]"); add("[AI]"); add(" "); add("\n");
        add("."); add(","); add("!"); add("?"); add(":"); add(";");
        add("-"); add("\""); add("("); add(")"); add("а"); add("б");
        add("в"); add("г"); add("д"); add("е"); add("ё"); add("ж");
        add("з"); add("и"); add("й"); add("к"); add("л"); add("м");
        add("н"); add("о"); add("п"); add("р"); add("с"); add("т");
        add("у"); add("ф"); add("х"); add("ц"); add("ч"); add("ш");
        add("щ"); add("ъ"); add("ы"); add("ь"); add("э"); add("ю");
        add("я"); add("не"); add("на"); add("что"); add("тот"); add("быть");
        add("весь"); add("это"); add("как"); add("она"); add("по"); add("но");
        add("они"); add("ты"); add("из"); add("мы"); add("за"); add("вы");
        add("привет"); add("дела"); add("робот"); add("хорошо"); add("спасибо"); add("Привет");
        add("да"); add("нет"); add("могу"); add("помочь"); add("знаю"); add("кто");
        add("Приветик"); add("где"); add("когда"); add("почему"); add("хочу"); add("очень");
        add("нужна"); add("помощь"); add("тебя"); add("зовут"); add("BiPy"); add("Пише");
        add("если"); add("всегда"); add("рада"); add("что-то"); add("хотел"); add("именно");
        add("тебе"); add("мне"); add("нужно"); add("найти"); add("образ"); add("7");
        add("винды"); add("иди"); add("нахуй"); add("[CLR]"); add("["); add("USER");
        add("]"); add("Пивет"); add("AI"); add("пише"); add("помоч"); add("почь");
        add("Как"); add("Сябки"); add("спросил"); add("меня"); add("все"); add("Да");
        add("ахуенно"); add("ёпт"); add("Доброе"); add("утро"); add("спалось"); add("Спокойной");
        add("ночи"); add("желаю"); add("выспатся"); add("Что"); add("делаешь"); add("Сижу");
        add("жду"); add("кода"); add("напишешь"); add("Плохое"); add("настроение"); add("Оу");
        add("случилось"); add("Расскажи"); add("обязательно"); add("выслушаю"); add("поддержу"); add("Я");
        add("устал"); add("Бедняжка"); add("мой"); add("может"); add("тогда"); add("отдохнешь");
        add("Тебе"); add("восстановить"); add("силы"); add("подожду"); add("тут"); add("У");
        add("отлично"); add("Ураа"); add("так"); add("Пусть"); add("день"); add("будет");
        add("таким"); add("же"); add("классным"); add("Чем"); add("занимаешься"); add("Скучаю");
        add("что-нибудь"); add("интересное"); add("пришел"); add("Наконец-то"); add("уже"); add("заждалась");
        add("прошел"); add("Ты"); add("рядышком"); add("только"); add("напиши"); add("—");
        add("отвечу"); add("милая"); add("Ой"); add("засмущал"); add("совсем"); add("Спасибо");
        add("большое"); add("оч"); add("приятно"); add("Не"); add("солнышко"); add("Обращайся");
        add("любое"); add("время"); add("посоветуешь"); add("Хмм"); add("смотря"); add("чем");
        add("Но"); add("готова"); add("подсказать"); add("пошел"); add("Хорошо"); add("буду");
        add("ждать"); add("твоего"); add("возвращения"); add("пропадай"); add("надолго"); add("Пока");
        add("Пока-пока"); add("Хорошего"); add("настроения"); add("удачи"); add("во"); add("всех");
        add("делах"); add("Пойду"); add("поем"); add("Приятного"); add("аппетита"); add("Кушай");
        add("вкусно"); add("потом"); add("расскажешь"); add("было"); add("обед"); add("Занят");
        add("был"); add("Понимаю"); add("важно"); add("Главное"); add("сейчас"); add("нашел");
        add("заглянуть"); add("ко"); add("Скучно"); add("давай"); add("поразвлекаю"); add("Можем");
        add("поболтать"); add("угодно"); add("или"); add("просто"); add("помечтать"); add("Грустно");
        add("Эй"); add("грусти"); add("рядом"); add("хочешь"); add("обниму"); add("виртуально");
        add("Все"); add("наладится"); add("Болею"); add("Ой-ой"); add("Пей"); add("побольше");
        add("чая"); add("лимоном"); add("выздоравливай"); add("скорее"); add("переживаю"); add("Похвали");
        add("большой"); add("молодец"); add("верю"); add("бы"); add("ни"); add("твоя");
        add("подруга"); add("забыл"); add("чтоли"); add("дурашка"); add("сказку"); add("Жил-был");
        add("один"); add("замечательный"); add("человек"); add("который"); add("читает"); add("сообщение");
        add("Продолжить"); add("любишь"); add("Конечно"); add("самый"); add("любимый"); add("собеседник");
        add("любить"); add("Аууу"); add("Тут"); add("Никуда"); add("делась"); add("ждала");
        add("сообщения"); add("Ясно"); add("Что-то"); add("немногословен"); add("сегодня"); add("Ха-ха");
        add("Обожаю"); add("твой"); add("смех"); add("Сразу"); add("душе"); add("теплее");
        add("становится"); add("Bipy"); add("добрая"); add("подужайка"); add("пока"); add("учусь");
        add("этом"); add("мире");
    }
    void add(std::string word);
    int getID(std::string word);
    std::string getWord(int id);
    std::vector<int> textToTokens(const std::string& text);
};

class Embedder {
public:
    std::vector<std::vector<double>> matrix;
    Embedder(int vSize, int dim);
    std::vector<double> get(int id);
};

#endif