/*********************************************************************//**
*	Pocitadlo.
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_info_counter.cpp
**********************************************************************/

#include "ent_environments.h"

InfoCounter::InfoCounter() : CBaseEnvironment()
{
	m_uiCounter = 0;
	m_uiThreshold = 1;
	m_bShowRemaining = false;
	m_sClassName = "info_counter";
	m_iProperties = ENT_PARM_RUNNABLE;
}


void InfoCounter::passFlags( int flags )
{
	if( flags & SHOW_REMAINING )
		m_bShowRemaining = true;
}

void InfoCounter::setParameters( parameters_t &parametersMap )
{
	CBaseEnvironment::setParameters( parametersMap );
	std::string value = getParameterValue( parametersMap, "threshold" );
	if( !value.empty() )
	{
		m_uiThreshold = atoi( value.c_str() );
	}

	m_sTargetTexts = getParameterValue( parametersMap, "targettexts" );
}

#include "game.h"

void InfoCounter::restart()
{
	CBaseEnvironment::restart();
	m_uiCounter = 0;
}

#include "level_loader.h"

void InfoCounter::compile()
{
	CBaseEnvironment::compile();

	entityList_t *pList = levelLoader.m_Entities.getEntitiesByName( m_sTargetTexts );
	if( pList )
	{
		for( entityList_t::iterator iter = pList->begin(); iter != pList->end(); ++iter )
		{
			if( (*iter)->getClassName() == "env_text" )
				m_TargetTexts.push_back( reinterpret_cast<EnvText*>( (*iter) ) );
		}
	
	}
	setText();
}

void InfoCounter::setText()
{
	std::ostringstream buf;
	if( m_bShowRemaining )
	{
		if( m_uiThreshold >= m_uiCounter )
			buf << m_uiThreshold - m_uiCounter;
		else
			 buf << 0;
	}
	else
		buf << m_uiCounter;
	for( std::list<EnvText*>::iterator iter = m_TargetTexts.begin(); iter != m_TargetTexts.end(); ++iter )
		(*iter)->setText( buf.str() );
}


void InfoCounter::onTarget( int target_type )
{
	
	if( target_type == 0 )
		m_uiCounter++;
	else
		m_uiCounter += target_type;

	if( m_uiThreshold <= m_uiCounter )
	{
		if( m_TargetList )
			for( entityList_t::iterator iter = m_TargetList->begin(); iter != m_TargetList->end(); ++iter )
				(*iter)->onTarget( 0 );
	}

	m_BackTimeData.push_front( BackTimeData() );
	m_BackTimeData.front().event_time = game.m_uiGameTime;
	m_BackTimeData.front().type = EVENT_STATUS;
	m_BackTimeData.front().values.event = m_uiCounter;

	setText();
}

void InfoCounter::goBackInTime()
{
	CBaseEnvironment::goBackInTime();

	for( std::list<BackTimeData>::reverse_iterator riter = m_BackTimeData.rbegin(); riter != m_BackTimeData.rend(); ++riter )
	{
		if( (*riter).type == EVENT_BORDER )
			return;

		if( (*riter).type == EVENT_STATUS )
		{	
			m_uiCounter = (*riter).values.event;
			setText();
			return;
		}
	}
}
