
#include "Globals.h"  // NOTE: MSVC stupidness requires this to be the same across all modules

#include "WebPlugin.h"
#include "../WebAdmin.h"
#include "../Root.h"





cWebPlugin::cWebPlugin()
{
	cWebAdmin * WebAdmin = cRoot::Get()->GetWebAdmin();
	if (WebAdmin != nullptr)
	{
		WebAdmin->AddPlugin(this);
	}
}





cWebPlugin::~cWebPlugin()
{
	ASSERT(m_Tabs.empty());  // Has ClearTabs() been called?

	// Remove from WebAdmin:
	cWebAdmin * WebAdmin = cRoot::Get()->GetWebAdmin();
	if (WebAdmin != nullptr)
	{
		WebAdmin->RemovePlugin(this);
	}
}





cWebPlugin::cTabNames cWebPlugin::GetTabNames(void) const
{
	std::list< std::pair<AString, AString>> NameList;
	for (auto itr = m_Tabs.cbegin(), end = m_Tabs.cend(); itr != end; ++itr)
	{
		NameList.push_back(std::make_pair((*itr)->m_Title, (*itr)->m_SafeTitle));
	}
	return NameList;
}





cWebPlugin::cTabPtr cWebPlugin::GetTabBySafeTitle(const AString & a_SafeTitle) const
{
	cCSLock Lock(m_CSTabs);
	for (auto itr = m_Tabs.cbegin(), end = m_Tabs.cend(); itr != end; ++itr)
	{
		if ((*itr)->m_SafeTitle == a_SafeTitle)
		{
			return *itr;
		}
	}
	return nullptr;
}





std::pair<AString, AString> cWebPlugin::GetTabNameForRequest(const HTTPRequest & a_Request)
{
	AStringVector Split = StringSplit(a_Request.Path, "/");
	if (Split.empty())
	{
		return std::make_pair(AString(), AString());
	}

	cCSLock Lock(m_CSTabs);
	cTabPtr Tab;
	if (Split.size() > 2)  // If we got the tab name, show that page
	{
		for (auto itr = m_Tabs.cbegin(), end = m_Tabs.cend(); itr != end; ++itr)
		{
			if ((*itr)->m_SafeTitle.compare(Split[2]) == 0)  // This is the one!
			{
				return std::make_pair((*itr)->m_Title, (*itr)->m_SafeTitle);
			}
		}
		// Tab name not found, display an "empty" page:
		return std::make_pair(AString(), AString());
	}

	// Show the first tab:
	if (!m_Tabs.empty())
	{
		return std::make_pair(m_Tabs.front()->m_SafeTitle, m_Tabs.front()->m_SafeTitle);
	}

	// No tabs at all:
	return std::make_pair(AString(), AString());
}




AString cWebPlugin::SafeString(const AString & a_String)
{
	AString RetVal;
	auto len = a_String.size();
	RetVal.reserve(len);
	for (size_t i = 0; i < len; ++i)
	{
		char c = a_String[i];
		if (c == ' ')
		{
			c = '_';
		}
		RetVal.push_back(c);
	}
	return RetVal;
}





void cWebPlugin::AddNewWebTab(const AString & a_Title, int a_UserData)
{
	auto Tab = std::make_shared<cTab>(a_Title, a_UserData);
	cCSLock Lock(m_CSTabs);
	m_Tabs.push_back(Tab);
}





void cWebPlugin::ClearTabs(void)
{
	// Remove the webadmin tabs:
	cTabPtrs Tabs;
	{
		cCSLock Lock(m_CSTabs);
		std::swap(Tabs, m_Tabs);
	}
}




