#include ".\triggermanager.h"

TriggerManager::TriggerManager(void)
{
	
}

TriggerManager::~TriggerManager(void)
{
	for ( TriggerIterator iter = triggerList.begin();
		  iter != triggerList.end();
		  iter++ ) {
		delete ( *iter );
		( *iter ) = 0;
	}
}

void TriggerManager::init( CollisionManager* newCollision, EventManager* newEvent ) {
	collisionManager = newCollision;
	eventManager = newEvent;
}

HRESULT TriggerManager::loadTriggers( char* filename ) {
	HRESULT r = S_OK;

	fstream triggerFile( filename );

	int aX, aY, bX, bY, cX, cY, dX, dY;
	int eventId, triggerId, option;
	POINT* left;
	POINT* right;
	POINT* top;
	POINT* bottom;

	while ( triggerFile.peek() != -1 ) {
		triggerFile >> triggerId >> aX >> aY >> bX >> bY >> cX >> cY >> dX >> dY >> eventId >> option;
		left = (collisionManager->getTilePoints( aX, aY )->getLeft());
		top = (collisionManager->getTilePoints( bX, bY )->getTop());
		right = (collisionManager->getTilePoints( cX, cY )->getRight());
		bottom = (collisionManager->getTilePoints( dX, dY )->getBottom());
		if ( eventId != NULL ) {
			triggerList.push_back( new Trigger( triggerId, left, top, right, bottom, eventId, option ) );
		} else {
			GameError( "Problems while loading trigger file" );
			return E_FAIL;
		}
	}

	triggerFile.close();

	return r;
}

void TriggerManager::checkTriggerCollisions( RECT* boundingBox) {
	for ( TriggerIterator iter = triggerList.begin();
		iter != triggerList.end();
		iter++ ) {	
		Trigger* tester = ( *iter );

		bool collided = false;
        collided = collisionManager->checkForCollision( boundingBox, tester->getTriggerPoints());
	
		if ( collided && tester->getReady() ){
			eventManager->activateEvent( tester->getEventToTrigger(), tester->getTriggerId(), tester->getOption() );
			tester->setActivity( true );
			tester->setReady( false );
		} else {
			if( !collided && tester->getActivity() ) {
				tester->setActivity( false );
				eventManager->deactivateEvent( tester->getEventToTrigger() );
			}
		}
	}
}

void TriggerManager::makeReady( int eventId ) {
	for( TriggerIterator iter = triggerList.begin();
		iter != triggerList.end();
		iter++ ) {
			
			Trigger* tester = (*iter);
			if( tester->getEventToTrigger() == eventId ) {
				tester->setReady( true );
			}
		}
}

void TriggerManager::resetTrigger( int triggerId ) {
    for( TriggerIterator iter = triggerList.begin();
		iter != triggerList.end();
		iter++ ) {
			
			Trigger* tester = (*iter);
			if( tester->getTriggerId() == triggerId ) {
				tester->setReady( true );
			}
		}
}

