#include "Player.h"


USING_NS_CC;


Player::Player() :
_speed(150),
_numBullets(30),
_bulletIndex(0),
_initialiced(false)
{
}


bool Player::init(){
	//primero la superclase
	if (!Sprite::init())
	{
		return false;
	}
	
	for (int i = 0; i < _numBullets; i++){
		_bulletPool.pushBack(Bullet::createPlayerBullet());
	}

	_currentAnimation = IDLE;

	_controller = TouchController::create();
	addChild(_controller);

	createIdleAnimation();

	createExplosionAnimation();

	// lanzamos la animacion por defecto
	runAction(_idleAnimation);

	scheduleShoot();
	return true;

}

void Player::setParent(Node* parent){
	Sprite::setParent(parent);
	//impide que las balas se incorporen mas de una vez a la escena
	if (!_initialiced){
		for (int i = 0; i < _numBullets; i++){
			//incorpora las balas al la escena
			getParent()->addChild(_bulletPool.at(i));
		}
		_initialiced = true;
	}
}

void Player::scheduleShoot(){
	
	//establecemos que la nave disparara cada medio segundo
	DelayTime *delayAction = DelayTime::create(0.5f);

	// creamos una accion a partir de una funcion
	CallFunc *callSelectorAction = CallFunc::create(CC_CALLBACK_0(Player::shoot, this));
	//creamos una secuencia que primero espera y luego dispara
	auto shootSequence = Sequence::create(delayAction, callSelectorAction, NULL);

	// envolvemos la secuencia un una accion RepeatForever
	runAction(RepeatForever::create(shootSequence));
}

void Player::createIdleAnimation(){
	//creamos un pool de imagenes para la animacion
	Vector animFrames;
	auto acc = 0;
	for (int i = 0; i < 4; i++){
		auto frame = SpriteFrame::create("animacion_nave.png", Rect(acc, 0, 50, 63));
		acc += 50;
		animFrames.pushBack(frame);
	}
	//si ninguna animacion esta corriendo el esprite por defecto es definido aqui
	this->setSpriteFrame(animFrames.at(0));

	//creamos una animacion con un tiempo de espera entre cada frame de 0.25s
	auto animation = Animation::createWithSpriteFrames(animFrames, 0.25f);

	//creamos la accion de animar el objeto animation
	auto animate = Animate::create(animation);

	//creamos una accion que repita para siempre la animacion
	_idleAnimation = RepeatForever::create(animate);

	// ponemos un tag a la animacion para poder pararla en el futuro
	_idleAnimation->setTag(Player::Animations::IDLE);
}

void Player::createExplosionAnimation(){
	Vector animFrames;
	auto acc = 0;
	for (int i = 0; i < 4; i++){
		auto frame = SpriteFrame::create("player_explosion.png", Rect(acc, 0, 50, 63));
		acc += 50;
		animFrames.pushBack(frame);
	}


	auto animation = Animation::createWithSpriteFrames(animFrames, 0.15f);

	//creamos la accion de animar el objeto animation, en este caso no necesitamos
	//un RepeatForever porque solo debe explotar una vez y parar.
	_explosionAnimation = Animate::create(animation);

	_explosionAnimation->setTag(Player::Animations::EXPLOSION);
}



void Player::update(float dt){
	float speed = _speed*dt;
	auto controller = _controller->getController();
	if (controller.upRight){
		setPosition(getPositionX() + speed, getPositionY() + speed);
	}
	else if (controller.upLeft){
		setPosition(getPositionX() - speed, getPositionY() + speed);
	}
	else if (controller.downRight){
		setPosition(getPositionX() + speed, getPositionY() - speed);
	}
	else if (controller.downLeft){
		setPosition(getPositionX() - speed, getPositionY() - speed);
	}
	else if (controller.left){
		setPositionX(getPositionX() - speed);
	}
	else if (controller.right){
		setPositionX(getPositionX() + speed);
	}
	else if (controller.down){
		setPositionY(getPositionY() - speed);
	}
	else if (controller.up){
		setPositionY(getPositionY() + speed);
	}
}

void Player::shoot(){
	_bulletIndex = _bulletIndex % _numBullets;
	auto bullet = _bulletPool.at(_bulletIndex);
	bullet->setAnchorPoint(Point(0.5, 0));
	if (!bullet->isVisible()){
		bullet->setPosition(getPositionX(),getPositionY()+getBoundingBox().size.height*0.5);
		bullet->setVisible(true);		
	}
	_bulletIndex++;
}