//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================

#include "VarEditDialog.h"
#include "RemoteServer.h"

#include <stdio.h>

#include <vgui/IInput.h>

#include <vgui_controls/Button.h>
#include <vgui_controls/ComboBox.h>
#include <vgui_controls/TextEntry.h>
#include <KeyValues.h>

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CVarEditDialog::CVarEditDialog(vgui::Panel *parent, const char *name) : Frame(parent, name)
{
	SetSize(280, 180);
	SetSizeable(false);
	m_pOKButton = new Button(this, "OKButton", "OK");
	m_pCancelButton = new Button(this, "CancelButton", "Cancel");
	m_pStringEdit = new TextEntry(this, "StringEdit");
	m_pComboEdit = new ComboBox(this, "ComboEdit", 12, false);
	m_pRules = NULL;
}

//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
CVarEditDialog::~CVarEditDialog()
{
//	input()->ReleaseAppModalSurface();
	if (m_pRules)
	{
		m_pRules->deleteThis();
	}
}

//-----------------------------------------------------------------------------
// Purpose: Configures and shows the var edit dialog
//-----------------------------------------------------------------------------
void CVarEditDialog::Activate(vgui::Panel *actionSignalTarget, KeyValues *rules)
{
	// configure
	AddActionSignalTarget(actionSignalTarget);
	m_pRules = rules->MakeCopy();

	const char *type = m_pRules->GetString("type");
	if (!stricmp(type, "enumeration"))
	{
		LoadControlSettings("Admin/VarEditDialog_ComboBox.res", "PLATFORM");
		m_pStringEdit->SetVisible(false);

		// fill in the combo box
		for (KeyValues *kv = m_pRules->FindKey("list", true)->GetFirstSubKey(); kv != NULL; kv = kv->GetNextKey())
		{
			Assert( 0 );
			// FIXME: This Assert doesn't compile
//			Assert(index++ == atoi(kv->GetName()));
			m_pComboEdit->AddItem(kv->GetString(), NULL);
		}

		// activate the current item
		m_pComboEdit->ActivateItemByRow(m_pRules->GetInt("enum"));
	}
	else if (!stricmp(type, "customlist"))
	{
		LoadControlSettings("Admin/VarEditDialog_ComboBox.res", "PLATFORM");
		m_pStringEdit->SetVisible(false);

		// fill in the combo box
		int index = 0;
		const char *currentValue = m_pRules->GetString("value");
		const char *parse = m_pRules->GetString("stringlist");
		while (*parse)
		{
			// newline-seperated map list
			if (*parse == '\n')
			{
				parse++;
				continue;
			}

			// pull out the map name
			const char *end = strstr(parse, "\n");
			if (!end)
				break;

			char customString[64];
			int nameSize = end - parse;
			if (nameSize >= sizeof(customString))
			{
				nameSize = sizeof(customString) - 1;
			}

			// copy in the name
			strncpy(customString, parse, nameSize);
			customString[nameSize] = 0;
			parse = end;

			// add to dropdown
			int itemID = m_pComboEdit->AddItem(customString, NULL);
			index++;

			// activate the current item
			if (!stricmp(customString, currentValue))
			{
				m_pComboEdit->ActivateItem(itemID);
			}
		}
	}
	else
	{
		// normal string edit
		LoadControlSettings("Admin/VarEditDialog_String.res", "PLATFORM");
		m_pComboEdit->SetVisible(false);
		m_pStringEdit->SelectAllOnFirstFocus(true);
		m_pStringEdit->SetText(m_pRules->GetString("value"));
	}

	// set value
	char title[256];
	_snprintf(title, sizeof(title) - 1, "Change %s", m_pRules->GetString("name"));
	SetTitle(title, false);

	// bring to front	
//	input()->SetAppModalSurface(GetVPanel());
	MoveToCenterOfScreen();
	BaseClass::Activate();
}

//-----------------------------------------------------------------------------
// Purpose: button command handler
//-----------------------------------------------------------------------------
void CVarEditDialog::OnCommand(const char *command)
{
	if (!stricmp(command, "OK"))
	{
		// change the value
		ApplyChanges();
		Close();
	}
	else if (!stricmp(command, "Cancel"))
	{
		Close();
	}
	else
	{
		BaseClass::OnCommand(command);
	}
}

//-----------------------------------------------------------------------------
// Purpose: Applies changes
//-----------------------------------------------------------------------------
void CVarEditDialog::ApplyChanges()
{
	const char *type = m_pRules->GetString("type");
	if (!stricmp(type, "enumeration"))
	{
		// get the enumeration position from the combo box
		int iVal = m_pComboEdit->GetActiveItem();
		char value[32];
		_snprintf(value, sizeof(value) - 1, "%d", iVal);
		RemoteServer().SetValue(m_pRules->GetName(), value);
	
	}
	else if (!stricmp(type, "customlist"))
	{
		char value[512];
		m_pComboEdit->GetText(value, sizeof(value));
		RemoteServer().SetValue(m_pRules->GetName(), value);
	}
	else
	{
		// normal string
		char value[512];
		m_pStringEdit->GetText(value, sizeof(value));
		RemoteServer().SetValue(m_pRules->GetName(), value);
	}

	// tell the caller the var changed
	PostActionSignal(new KeyValues("VarChanged", "var", m_pRules->GetName()));
}

//-----------------------------------------------------------------------------
// Purpose: Deletes on close
//-----------------------------------------------------------------------------
void CVarEditDialog::OnClose()
{
	BaseClass::OnClose();
	MarkForDeletion();
}