#include "mxeventpresenter.h"

#include "decomp.h"
#include "mxautolocker.h"
#include "mxeventmanager.h"
#include "mxomni.h"
#include "mxvariabletable.h"

DECOMP_SIZE_ASSERT(MxEventPresenter, 0x54);

// FUNCTION: LEGO1 0x100c2b70
MxEventPresenter::MxEventPresenter()
{
	Init();
}

// FUNCTION: LEGO1 0x100c2d40
MxEventPresenter::~MxEventPresenter()
{
	Destroy();
}

// FUNCTION: LEGO1 0x100c2da0
void MxEventPresenter::Init()
{
	m_data = NULL;
}

// FUNCTION: LEGO1 0x100c2db0
MxResult MxEventPresenter::AddToManager()
{
	MxResult ret = FAILURE;

	if (EventManager()) {
		ret = SUCCESS;
		EventManager()->AddPresenter(*this);
	}

	return ret;
}

// FUNCTION: LEGO1 0x100c2de0
void MxEventPresenter::Destroy()
{
	if (EventManager())
		EventManager()->RemovePresenter(*this);

	m_criticalSection.Enter();

	if (m_data)
		delete[] m_data;

	Init();

	m_criticalSection.Leave();
}

// FUNCTION: LEGO1 0x100c2e30
void MxEventPresenter::CopyData(MxStreamChunk* p_chunk)
{
	m_data = new MxU8[p_chunk->GetLength()];
	memcpy(m_data, p_chunk->GetData(), p_chunk->GetLength());
}

// FUNCTION: LEGO1 0x100c2e70
void MxEventPresenter::ReadyTickle()
{
	MxStreamChunk* chunk = NextChunk();

	if (chunk) {
		CopyData(chunk);
		m_subscriber->FUN_100b8390(chunk);
		ParseExtra();
		m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
		m_currentTickleState = TickleState_Starting;
	}
}

// FUNCTION: LEGO1 0x100c2eb0
void MxEventPresenter::StartingTickle()
{
	MxStreamChunk* chunk = NextChunk();

	if (chunk && m_action->GetElapsedTime() >= chunk->GetTime()) {
		m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
		m_currentTickleState = TickleState_Streaming;
	}
}

// FUNCTION: LEGO1 0x100c2ef0
MxResult MxEventPresenter::PutData()
{
	MxAutoLocker lock(&m_criticalSection);

	if (IsEnabled()) {
		if (m_currentTickleState >= TickleState_Streaming &&
			(m_currentTickleState <= TickleState_Repeating || m_currentTickleState == TickleState_Done)) {
			if (m_currentChunk && m_currentChunk->GetLength()) {
				if (m_data[12] == 2) {
					const char* data = (const char*) m_currentChunk->GetData();
					MxVariableTable* variableTable = VariableTable();

					const char* key = data;
					const char* value = &data[strlen(data) + 1];
					strlen(value);
					variableTable->SetVariable(key, value);
				}

				if (m_currentTickleState == TickleState_Streaming)
					m_subscriber->FUN_100b8390(m_currentChunk);
				m_currentChunk = NULL;
			}
		}
	}

	return SUCCESS;
}
