#include "trie.h"
#include "simpleQueue.h"



Trie::Trie()
{
	myContents.clear();
}


Trie::~Trie()
{
	clearTrie();
}


void Trie::setMinSupport(const DynamicArray<int> &path, bool hasMinSupport)
{
	int level = path.count();
	for (int i = 0; i < myContents[level].count(); i++)
	{
		if (path == myContents[level][i]->thisSet)
		{
			myContents[level][i]->hasMinSupport = true;
			break;
		}
	}
}

bool Trie::getHasMinSupport(const DynamicArray<int> &path) const
{
	int level = path.count();
	if (level >= myContents.count()) return false;

	for (int i = 0; i < myContents[level].count(); i++)
	{
		if (path == (myContents[level][i]->thisSet))
			return myContents[level][i]->hasMinSupport;
	}

	return false;
}


bool Trie::getPathExists(const DynamicArray<int> &path) const
{
	int level = path.count();

	if (level >= myContents.count())
		return false;

	for (int i = 0; i < myContents[level].count(); i++)
	{
		if (path == myContents[level][i]->thisSet)
		{
			return true;
		}
	}

	return false;
}



bool Trie::addNode(const DynamicArray<int> &path, int itemId)
{
	return addNode(path);
}



bool Trie::addNode(const DynamicArray<int> &path)
{
	int level = path.count();
	while (level >= myContents.count())
		myContents.insert(DynamicArray<Itemset*>());

	myContents[level].insert(new Itemset(path));

	return true;
}



void Trie::getAllPaths(DynamicArray<DynamicArray<int>> &allPaths) const
{
	allPaths.clear();

	for (int i = 0; i < myContents.count(); i++)
	{
		for (int j = 0; j < myContents[i].count(); j++)
		{
			allPaths.insert(myContents[i][j]->thisSet);
		}
	}
}



void Trie::getAllPathsAtDepth(DynamicArray<DynamicArray<int>> &pathsAtDepth, int depth) const
{
	pathsAtDepth.clear();

	if (depth >= myContents.count()) return;

	for (int j = 0; j < myContents[depth].count(); j++)
	{
		pathsAtDepth.insert(myContents[depth][j]->thisSet);
	}
}




bool Trie::isEmpty() const
{
	return (myContents.count() > 0);
}



bool Trie::removeNode(const DynamicArray<int> &path)
{
	int level = path.count();

	if (level >= myContents.count()) return false;

	for (int i = 0; i < myContents[level].count(); i++)
	{
		if (path == myContents[level][i]->thisSet)
		{
			myContents[level].removeAt(i);
			return true;
		}
	}

	return false;
}


void Trie::clearTrie()
{
	for (int i = myContents.count() - 1; i >= 0; i--)
	{
		for (int j = myContents[i].count() - 1; j >= 0; j--)
		{
			delete myContents[i][j];
		}
	}

	myContents.clear();
}
