#include "Bullet.h"
#include "Player.h"
#include "BasicEnemy.h"

USING_NS_CC;

bool Bullet::initWithFile(const std::string& filename){

	if (!Sprite::initWithFile(filename)){
		return false;
	}
	_enemyTarget = nullptr;
	_speed = 160;
	//invisible por defecto
	setVisible(false);
	schedule(schedule_selector(Bullet::update));
	return true;
}


Bullet* Bullet::createPlayerBullet(){
	Bullet *sprite = new (std::nothrow) Bullet();
	if (sprite && sprite->initWithFile("disparo_nave.png"))
	{
		sprite->_type = PLAYER_BULLET;
		sprite->autorelease();
		return sprite;
	}
	CC_SAFE_DELETE(sprite);
	return nullptr;
}

Bullet* Bullet::createEnemyBullet(){
	Bullet *sprite = new (std::nothrow) Bullet();
	if (sprite && sprite->initWithFile("disparo_enemigo.png"))
	{
		sprite->_type = ENEMY_BULLET;
		sprite->autorelease();
		return sprite;
	}
	CC_SAFE_DELETE(sprite);
	return nullptr;
}

void Bullet::update(float dt){
	if (!this->isVisible()) return;

	if (_type == PLAYER_BULLET){
		//para arriba
		setAnchorPoint(Point(0.5, 0));
		setPosition(getPositionX(), getPositionY() + _speed*dt);
		if (getPositionY() > Director::getInstance()->getVisibleSize().height){
			setVisible(false);
		}
		for (int i = 0; i < _playerTargets.size(); i++){
			BasicEnemy* enemy = _playerTargets.at(i);
			if (getBoundingBox().intersectsRect(enemy->getBoundingBox()) && enemy->isVisible() 
				&& enemy->getCurrentAnimation() != BasicEnemy::Animations::EXPLOSION){
				//colision
				enemy->setCurrentAnimation(BasicEnemy::Animations::EXPLOSION);
				setVisible(false);
			}
		}
	}
	else if (_type == ENEMY_BULLET){
		//para abajo
		setAnchorPoint(Point(0.5, 1));
		setPosition(getPositionX(), getPositionY() - _speed*dt);
		if (getPositionY() < 0){
			setVisible(false);
		}

		if (getBoundingBox().intersectsRect(_enemyTarget->getBoundingBox()) && 
			_enemyTarget->isVisible() && _enemyTarget->getCurrentAnimation() != BasicEnemy::Animations::EXPLOSION){
			//colision
			_enemyTarget->setCurrentAnimation(Player::Animations::EXPLOSION);
			setVisible(false);
		}

	}
}