#include "BaseGameLayer.h"
#include "GameManager.h"
#include "MainMenuLayer.h"
#include "SelectMenuLayer.h"
#include "CustomAudioManager.h"

USING_NS_CC;

BaseGameLayer::~BaseGameLayer(){
	CC_SAFE_DELETE(_bg);
}

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


bool BaseGameLayer::init(){
	if (!Layer::init()){
		return false;
	}
	_visibleSize = Director::getInstance()->getVisibleSize();
	_completionPercentage = 0;
	_enemyIndex = 0;
	_scoreToCompleTheLevel = 1000;
	isLevelComplete = false;
	setTag(0);
	GameManager::getInstance()->setPlayerScore(0);

	//todas las pantallas de nuestro juego usaran este sprite sheet
	SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hunter.plist", "Hunter.png");
	_gameBatchNode = SpriteBatchNode::create("Hunter.png");
	addChild(_gameBatchNode,ForegroundPos);


	//player
	_player = Player::create();
	_player->setPosition(_visibleSize.width*0.5, _visibleSize.height*0.3);
	_gameBatchNode->addChild(_player, ForegroundPos);


	//UI
	createHealthIndicator();
	createScoreAndPercentageLabels();
	createPauseAndResumeButtons();
	createRespawnButton();

	//crea el boton de ir hacia atras
	_backButton = ui::Button::create("back0", "back1", "back1", ui::Widget::TextureResType::PLIST);
	_backButton->setAnchorPoint(Point(0, 0.5));
	_backButton->addClickEventListener(CC_CALLBACK_0(BaseGameLayer::actionButtonBack, this));
	_backButton->setPosition(Point(42.5* getScaleX(), 50 * getScaleY()));
	_backButton->setEnabled(false);
	_backButton->setVisible(false);
	addChild(_backButton,UIPos);


	return true;
}

void BaseGameLayer::levelCompleteActions(){
	if (!isLevelComplete){
		float aniTime = 2.0f;
		auto winnerLabel = Label::createWithTTF("Level complete", "fonts/arial.ttf", 40);
		winnerLabel->setTextColor(Color4B::ORANGE);
		winnerLabel->setPosition(Point(_visibleSize.width*0.5, _visibleSize.height - 100 * getScaleY()));
		addChild(winnerLabel, UIPos);
		GameManager::getInstance()->saveGame(getTag());
		
		auto moveTo = MoveTo::create(aniTime, Point(_visibleSize.width*0.5, _visibleSize.height *0.5));
		winnerLabel->runAction(moveTo);

		CallFunc *loadMenu = CallFunc::create(CC_CALLBACK_0(BaseGameLayer::levelCompleteActionsHelper, this));
		DelayTime *delayAction = DelayTime::create(aniTime);
		auto sequence = Sequence::create(delayAction, loadMenu, NULL);
		runAction(sequence);
	}
	isLevelComplete = true;
}

void BaseGameLayer::levelCompleteActionsHelper(){
	CustomAudioManager::getInstance()->stopAll();
	Director::getInstance()->replaceScene(SelectMenuLayer::createScene());
}


void BaseGameLayer::resetPlayer(){
	_player->reset();
	_player->setPosition(_visibleSize.width*0.5, _visibleSize.height*0.3);
	GameManager::getInstance()->setPlayerScore(0);
}


void BaseGameLayer::createHealthIndicator(){
	auto healthContainerIndicator = Sprite::createWithSpriteFrameName("health_container_indicartor");
	healthContainerIndicator->setAnchorPoint(Point(0, 0.5));
	healthContainerIndicator->setPosition(Point(20 * getScaleX(), _visibleSize.height - 25 * getScaleY()));
	_gameBatchNode->addChild(healthContainerIndicator, UIPos);
	auto nextPosition = Point(healthContainerIndicator->getPositionX() + healthContainerIndicator->getBoundingBox().size.width + 5, healthContainerIndicator->getPositionY());

	auto healthContainer = Sprite::createWithSpriteFrameName("health_container");
	healthContainer->setScaleY(0.80f);
	healthContainer->setAnchorPoint(Point(0, 0.5));
	healthContainer->setPosition(nextPosition);
	_gameBatchNode->addChild(healthContainer, UIPos);

	_healthBar = Sprite::createWithSpriteFrameName("health_bar");
	_healthBar->setAnchorPoint(Point(0, 0.5));
	_healthBar->setPosition(nextPosition);
	_healthBar->setScaleY(0.78f);
	_healthBar->setScaleX(1);
	//nos aseguramos que aunque se reordenen los sprites, este estara arriba siempre.
	_gameBatchNode->addChild(_healthBar, UIPos+1);
}

void BaseGameLayer::createScoreAndPercentageLabels(){
	//score
	_scoreLabel = Label::createWithTTF("Score: 0", "fonts/arial.ttf", 15);
	_scoreLabel->setAnchorPoint(Point(0.5, 0.5));
	_scoreLabel->setPosition(Point(_visibleSize.width*0.5, _healthBar->getPositionY()));
	_scoreLabel->setTextColor(Color4B::BLACK);
	addChild(_scoreLabel, UIPos);

	//percentage
	_completionPercentageLabel = Label::createWithTTF("0 %", "fonts/arial.ttf", 30);
	_completionPercentageLabel->setAnchorPoint(Point(1, 0));
	_completionPercentageLabel->setTextColor(Color4B::ORANGE);
	_completionPercentageLabel->setPosition(Point(_visibleSize.width - 5* getScaleX(), 5 * getScaleY()));
	addChild(_completionPercentageLabel, UIPos);
}

void BaseGameLayer::createPauseAndResumeButtons(){
	//pause button
	_pauseButton = ui::Button::create("pause0", "pause1", "pause1", ui::Widget::TextureResType::PLIST);
	_pauseButton->setScale(0.8f);
	_pauseButton->addClickEventListener(CC_CALLBACK_0(BaseGameLayer::pauseButtonAction, this));
	_pauseButton->setAnchorPoint(Point(1, 0.5));
	_pauseButton->setPosition(Point(_visibleSize.width - 20 * getScaleX(), _scoreLabel->getPositionY()));
	addChild(_pauseButton, UIPos);

	//play
	_playButton = ui::Button::create("play0", "play1", "play1", ui::Widget::TextureResType::PLIST);
	_playButton->setScale(0.8f);
	_playButton->addClickEventListener(CC_CALLBACK_0(BaseGameLayer::playButtonAction, this));
	_playButton->setAnchorPoint(Point(1, 0.5));
	_playButton->setVisible(false);
	_playButton->setEnabled(false);
	_playButton->setPosition(_pauseButton->getPosition());
	addChild(_playButton, UIPos);
}

void BaseGameLayer::createRespawnButton()
{
	_respawnButton = ui::Button::create("respawn0", "respawn1", "respawn1", ui::Widget::TextureResType::PLIST);
	_respawnButton->setPosition(Point(_visibleSize.width*0.5, _visibleSize.height*0.5));
	_respawnButton->setVisible(false);
	_respawnButton->setEnabled(false);
	_respawnButton->addClickEventListener(CC_CALLBACK_0(BaseGameLayer::respawnButtonAction, this));
	addChild(_respawnButton, UIPos);
}

void BaseGameLayer::actionButtonBack()
{
	CustomAudioManager::getInstance()->stopAll();
	Director::getInstance()->replaceScene(TransitionSplitRows::create(1, MainMenuLayer::createScene()));
}

void BaseGameLayer::update(float dt)
{
	if (_player->isVisible() && _bg){
		_bg->update(dt);
	}
	else{
		_respawnButton->setVisible(true);
		_respawnButton->setEnabled(true);
		_backButton->setEnabled(true);
		_backButton->setVisible(true);
	}

	//actualizar ui
	_healthBar->setScaleX(static_cast(_player->getHealth()) / static_cast(MAX_HEALTH));
	_ostr << GameManager::getInstance()->getPlayerScore();
	_scoreLabel->setString("Score: " + _ostr.str());
	_ostr.str("");
	_ostr << (GameManager::getInstance()->getPlayerScore() * 100) / _scoreToCompleTheLevel;
	_completionPercentageLabel->setString( _ostr.str() + " %");
	_ostr.str("");
	if (GameManager::getInstance()->getPlayerScore() >= _scoreToCompleTheLevel){
		levelCompleteActions();
	}
}

void BaseGameLayer::pauseButtonAction()
{
	pause();
	CustomAudioManager::getInstance()->pauseAll();
	_pauseButton->setVisible(false);
	_pauseButton->setEnabled(false);
	_playButton->setVisible(true);
	_playButton->setEnabled(true);
	_respawnButton->setVisible(true);
	_respawnButton->setEnabled(true);
	_backButton->setEnabled(true);
	_backButton->setVisible(true);
}

void BaseGameLayer::playButtonAction()
{
	resume();
	CustomAudioManager::getInstance()->resumeAll();
	_pauseButton->setVisible(true);
	_pauseButton->setEnabled(true);
	_playButton->setVisible(false);
	_playButton->setEnabled(false);
	_respawnButton->setVisible(false);
	_respawnButton->setEnabled(false);
	_backButton->setEnabled(false);
	_backButton->setVisible(false);
}

void BaseGameLayer::respawnButtonAction()
{
	playButtonAction();
	resetPlayer();
	_respawnButton->setVisible(false);
	_respawnButton->setEnabled(false);
}