#include "Level1.h"
#include "AudioEngine.h"
#include "GameManager.h"
#include "MainMenuLayer.h"

USING_NS_CC;

Scene* Level1::createScene()
{
	auto scene = Scene::create();
	auto layer = Level1::create();
	scene->addChild(layer);
	return scene;
}

bool Level1::init()
{
	if (!BaseGameLayer::init())
	{
		return false;
	}
	_numEnemies = 20;
	_enemyIndex = 0;
	setTag(1);//level1
	_scoreToCompleTheLevel = 1000;

	initActors();
	awakeEnemyScheduler();

	//bucle del juego
	this->schedule(schedule_selector(Level1::update));

	//bucle de sonido
	experimental::AudioEngine::play2d("music/Cetus.mp3", true, GameManager::getInstance()->getBgVolume()*0.01);

	//scheduleUpdate();
	schedule(schedule_selector(Level1::update));
	return true;
}

void Level1::initActors()
{
	for (int i = 0; i < _numEnemies; i++){
		auto enemy = BasicEnemy::create();
		//da informacion a los enemigos acerca del player
		enemy->setTarget(_player);
		_enemyPool.pushBack(enemy);
		_gameBatchNode->addChild(enemy, ForegroundPos);
	}
	//da información al player acerca de los enemigos
	_player->setTargets(_enemyPool);
}




void Level1::update(float dt)
{
	BaseGameLayer::update(dt);
	_player->update(dt);
	//mira colisiones entre enemigos y player
	checkCollisions();
}

void Level1::respawnButtonAction()
{
	BaseGameLayer::respawnButtonAction();
	for (int i = 0; i < _numEnemies; i++){
		_enemyPool.at(i)->reset();
	}
}

void Level1::pauseButtonAction()
{
	BaseGameLayer::pauseButtonAction();
	experimental::AudioEngine::pauseAll();
	_player->pause();
	for (Sprite* enemy : _enemyPool){
		enemy->pause();
	}
}

void Level1::playButtonAction()
{
	BaseGameLayer::playButtonAction();
	experimental::AudioEngine::resumeAll();
	_player->resume();
	for (Sprite* enemy : _enemyPool){
		enemy->resume();
	}
}

void Level1::awakeEnemy()
{
	_enemyIndex = _enemyIndex % _numEnemies;

	auto enemy = _enemyPool.at(_enemyIndex);
	//posicionamos de forma aleatoria en el eje x un enemigo, teniendo en cuenta
	//que cada enemigo mide 50*50
	enemy->setPositionX(RandomHelper::random_int(static_cast(0 + 50 * 0.5),
		static_cast(_visibleSize.width - 50 * 0.5)));
	enemy->setPositionY(_visibleSize.height + 50 * 0.5);
	//reseteamos el estado del enemigo
	enemy->setCurrentAnimation(BasicEnemy::Animations::IDLE);
	if (!enemy->isVisible()){
		enemy->setVisible(true);
	}

	_enemyIndex++;
}


void Level1::awakeEnemyScheduler()
{
	//se generera un enemigo cada segundo
	DelayTime *delayAction = DelayTime::create(1.0f);

	// creamos la acción que despertara a los enemigos
	CallFunc *callSelectorAction = CallFunc::create(CC_CALLBACK_0(GameLayer::awakeEnemy, this));
	auto awakeEnemySequence = Sequence::create(delayAction, callSelectorAction, NULL);

	// repetimos esto hasta el final del juego
	runAction(RepeatForever::create(awakeEnemySequence));
}


void Level1::checkCollisions()
{
	for (int i = 0; i < _numEnemies; i++){
		auto enemy = _enemyPool.at(i);
		if (_player->getBoundingBox().intersectsRect(enemy->getBoundingBox())
			&& enemy->isVisible() && _player->isVisible()){
			enemy->setCurrentAnimation(BasicEnemy::Animations::EXPLOSION);
			_player->setHealth(0);
		}
	}
}