#include "SMILES.h"



bool SMILES::kontrola(const std::vector<char> & vstup)
{
	char predchoziznak = ' ';
	std::string aktualniprvek;
	bool nazevprvku = false;
	if (isalpha(vstup[0]) == false)
	{
		return false;
	}

	if (vstup[vstup.size() - 1] == '#' || vstup[vstup.size() - 1] == '-' || vstup[vstup.size() - 1] == '=')
	{
		return false;
	}
	for (auto&& it : vstup)
	{
		if ((it == '-' || it == '=' || it == '#') && (predchoziznak == '-' || predchoziznak == '=' || predchoziznak == '#'))
		{
			return false;
		}
		if (it == ')' && (predchoziznak == '(' || predchoziznak == '-' || predchoziznak == '=' || predchoziznak == '#'))
		{
			return false;
		}
		
		predchoziznak = it;
	}
	return true;
}

void SMILES::prevedvzorec(const std::vector<char> & vstup)
{

	if (kontrola(vstup))
	{

		for (auto && it : vstup)
		{


			if (cteniprvku)
			{
				if (islower(it))
				{
					aktualniprvek = aktualniprvek + it;
				}
				else
				{
					prvky.push_back(aktualniprvek);
					aktualniprvek.clear();
					cteniprvku = false;
					if (aktualnipredchozi != 0)
					{
						vytvorvazbu();
					}
					aktualnipredchozi = prvky.size();
				}
				
			}
			if (it == '(')
			{
				odbocky.push_back(aktualnipredchozi);
			}
			if (it == ')')
			{
				aktualnipredchozi = odbocky[odbocky.size() - 1];

				odbocky.erase(odbocky.end() - 1);
			}
			if (ctenibackreference && !isdigit(it))
			{

					ctenibackreference = false;
					auto klic = smycky.find(value);
					if (klic != smycky.end())
					{
						int temp = aktualnipredchozi;
						aktualnipredchozi = klic->second;
						vytvorvazbu();
						aktualnipredchozi = temp;
					}
					else
					{
						smycky.insert(std::make_pair(value, aktualnipredchozi));
					}
					value = 0;
				
			}

			if (isdigit(it))
			{
				value = value * 10 + it - '0';
				ctenibackreference = true;
			}
			if (isupper(it))
			{
				aktualniprvek = it;
				cteniprvku = true;
			}
			if (it == '=')
			{
				poslednivazba = it;
			}
			if (it == '#')
			{
				poslednivazba = it;
			}

		}
	}
	else
	{
		std::cout << "Invalid input";
	}
}

void SMILES::vytvorvazbu()
{
	if (poslednivazba == '-')
	{
		auto it2 = jednoduchevazby.find(aktualnipredchozi);
		if (it2 == jednoduchevazby.end())
		{
			std::vector<int> temp;
			temp.push_back(prvky.size());
			jednoduchevazby.insert(std::make_pair(aktualnipredchozi, temp));
		}
		else
		{
			it2->second.push_back(prvky.size());
		}
	}
	if (poslednivazba == '=')
	{
		auto it2 = dvojitevazby.find(aktualnipredchozi);
		if (it2 == dvojitevazby.end())
		{
			std::vector<int> temp;
			temp.push_back(prvky.size());
			dvojitevazby.insert(std::make_pair(aktualnipredchozi, temp));
		}
		else
		{
			it2->second.push_back(prvky.size());
		}
		poslednivazba = '-';
	}
	if (poslednivazba == '#')
	{
		auto it2 = trojitevazby.find(aktualnipredchozi);
		if (it2 == trojitevazby.end())
		{
			std::vector<int> temp;
			temp.push_back(prvky.size());
			trojitevazby.insert(std::make_pair(aktualnipredchozi, temp));
		}
		else
		{
			it2->second.push_back(prvky.size());
		}
		poslednivazba = '-';
	}
}




void SMILES::vypisprvky()
{
	int count = 1;
	std::cout << "Prvky:" << std::endl;
	for(auto&& it : prvky)
	{
		std::cout << count << it << std::endl;
		count++;
	}
}

void SMILES::vypisvazby()
{
	int count = 1;
	for (auto&& it : prvky)
	{
		auto it2 = jednoduchevazby.find(count);
		if (it2 != jednoduchevazby.end())
		{
			for (int i = 0; i < it2->second.size(); i++)
			{
				std::cout << it2->first << " - " << it2->second[i] << std::endl;
			}
		}

		auto it3 = dvojitevazby.find(count);
		if (it3 != dvojitevazby.end())
		{
			for (int i = 0; i < it3->second.size(); i++)
			{
				std::cout << it3->first << " = " << it3->second[i] << std::endl;
			}
		}
		auto it4 = trojitevazby.find(count);
		if (it4 != trojitevazby.end())
		{
			for (int i = 0; i < it4->second.size(); i++)
			{
				std::cout << it4->first << " # " << it4->second[i] << std::endl;
			}
		}
		count++;
	}
}