#include "LocalBrowserModel.h"

#include "LocalBrowserView.h"

#include <cmath>

#include "client/Client.h"
#include "client/SaveFile.h"

#include "common/tpt-minmax.h"

LocalBrowserModel::LocalBrowserModel():
	stamp(NULL),
	currentPage(1),
	stampToFront(1)
{
	//stampIDs = Client::Ref().GetStamps();
	stampIDs = Client::Ref().GetStamps(0, 16);
}


std::vector<SaveFile*> LocalBrowserModel::GetSavesList()
{
	return savesList;
}

void LocalBrowserModel::AddObserver(LocalBrowserView * observer)
{
	observers.push_back(observer);
	observer->NotifySavesListChanged(this);
	observer->NotifyPageChanged(this);
}

void LocalBrowserModel::notifySavesListChanged()
{
	for (size_t i = 0; i < observers.size(); i++)
	{
		observers[i]->NotifySavesListChanged(this);
		observers[i]->NotifyPageChanged(this);
	}
}

void LocalBrowserModel::notifyPageChanged()
{
	for (size_t i = 0; i < observers.size(); i++)
	{
		observers[i]->NotifyPageChanged(this);
	}
}

SaveFile * LocalBrowserModel::GetSave()
{
	return stamp;
}

void LocalBrowserModel::SetSave(SaveFile * newStamp)
{
	delete stamp;
	stamp = new SaveFile(*newStamp);
}

bool LocalBrowserModel::GetMoveToFront()
{
	return stampToFront;
}

void LocalBrowserModel::SetMoveToFront(bool move)
{
	stampToFront = move;
}

void LocalBrowserModel::UpdateSavesList(int pageNumber)
{
	std::vector<SaveFile*> tempSavesList = savesList;
	savesList.clear();
	currentPage = pageNumber;
	notifyPageChanged();
	notifySavesListChanged();
	//notifyStampsListChanged();
	/*for(int i = 0; i < tempSavesList.size(); i++)
	{
		delete tempSavesList[i];
	}*/

	stampIDs = Client::Ref().GetStamps((pageNumber-1)*20, 20);

	for (size_t i = 0; i < stampIDs.size(); i++)
	{
		SaveFile * tempSave = Client::Ref().GetStamp(stampIDs[i]);
		if (tempSave)
		{
			savesList.push_back(tempSave);
		}
	}
	notifySavesListChanged();
}

void LocalBrowserModel::RescanStamps()
{
	Client::Ref().RescanStamps();
}

int LocalBrowserModel::GetPageCount()
{
	return std::max(1, (int)(std::ceil(float(Client::Ref().GetStampsCount())/20.0f)));
}

void LocalBrowserModel::SelectSave(ByteString stampID)
{
	for (size_t i = 0; i < selected.size(); i++)
	{
		if (selected[i] == stampID)
		{
			return;
		}
	}
	selected.push_back(stampID);
	notifySelectedChanged();
}

void LocalBrowserModel::DeselectSave(ByteString stampID)
{
	bool changed = false;
restart:
	for (size_t i = 0; i < selected.size(); i++)
	{
		if (selected[i] == stampID)
		{
			selected.erase(selected.begin()+i);
			changed = true;
			goto restart; //Just ensure all cases are removed.
		}
	}
	if(changed)
		notifySelectedChanged();
}

void LocalBrowserModel::notifySelectedChanged()
{
	for (size_t i = 0; i < observers.size(); i++)
	{
		LocalBrowserView* cObserver = observers[i];
		cObserver->NotifySelectedChanged(this);
	}
}

LocalBrowserModel::~LocalBrowserModel() {
	delete stamp;
}

