#include "smartsprite.h"

// Constructor
SmartSprite::SmartSprite(Texture *texture, SDL_Renderer *renderer)
{
	// Copia punteros
	setTexture(texture);
	setRenderer(renderer);

	// Inicializa el objeto
	init();
}

// Inicializa el objeto
void SmartSprite::init()
{
	enabled = false;
	enabledCounter = 0;
	onDestination = false;
	destX = 0;
	destY = 0;
	counter = 0;
	finished = false;
}

// Actualiza la posición y comprueba si ha llegado a su destino
void SmartSprite::update()
{
	if (enabled)
	{
		// Actualiza las variables internas del objeto
		MovingSprite::update();

		// Comprueba el movimiento
		checkMove();

		// Comprueba si ha terminado
		checkFinished();
	}
}

// Pinta el objeto en pantalla
void SmartSprite::render()
{
	if (enabled)
	{
		// Muestra el sprite por pantalla
		MovingSprite::render();
	}
}

// Obtiene el valor de la variable
bool SmartSprite::isEnabled()
{
	return enabled;
}

// Establece el valor de la variable
void SmartSprite::setEnabled(bool enabled)
{
	this->enabled = enabled;
}

// Obtiene el valor de la variable
int SmartSprite::getEnabledCounter()
{
	return enabledCounter;
}

// Establece el valor de la variable
void SmartSprite::setEnabledCounter(int value)
{
	enabledCounter = value;
}

// Establece el valor de la variable
void SmartSprite::setDestX(int x)
{
	destX = x;
}

// Establece el valor de la variable
void SmartSprite::setDestY(int y)
{
	destY = y;
}

// Obtiene el valor de la variable
int SmartSprite::getDestX()
{
	return destX;
}

// Obtiene el valor de la variable
int SmartSprite::getDestY()
{
	return destY;
}

// Comprueba el movimiento
void SmartSprite::checkMove()
{
	// Comprueba si se desplaza en el eje X hacia la derecha
	if (getAccelX() > 0 || getVelX() > 0)
	{
		// Comprueba si ha llegado al destino
		if (getPosX() > destX)
		{
			// Lo coloca en posición
			setPosX(destX);

			// Lo detiene
			setVelX(0.0f);
			setAccelX(0.0f);
		}
	}
	// Comprueba si se desplaza en el eje X hacia la izquierda
	else if (getAccelX() < 0 || getVelX() < 0)
	{
		// Comprueba si ha llegado al destino
		if (getPosX() < destX)
		{
			// Lo coloca en posición
			setPosX(destX);

			// Lo detiene
			setVelX(0.0f);
			setAccelX(0.0f);
		}
	}

	// Comprueba si se desplaza en el eje Y hacia abajo
	if (getAccelY() > 0 || getVelY() > 0)
	{
		// Comprueba si ha llegado al destino
		if (getPosY() > destY)
		{
			// Lo coloca en posición
			setPosY(destY);

			// Lo detiene
			setVelY(0.0f);
			setAccelY(0.0f);
		}
	}
	// Comprueba si se desplaza en el eje Y hacia arriba
	else if (getAccelY() < 0 || getVelY() < 0)
	{
		// Comprueba si ha llegado al destino
		if (getPosY() < destY)
		{
			// Lo coloca en posición
			setPosY(destY);

			// Lo detiene
			setVelY(0.0f);
			setAccelY(0.0f);
		}
	}
}

// Comprueba si ha terminado
void SmartSprite::checkFinished()
{
	// Comprueba si ha llegado a su destino
	onDestination = (getPosX() == destX && getPosY() == destY) ? true : false;

	if (onDestination)
	{ // Si esta en el destino comprueba su contador
		if (enabledCounter == 0)
		{ // Si ha llegado a cero, deshabilita el objeto y lo marca como finalizado
			finished = true;
		}
		else
		{ // Si no ha llegado a cero, decrementa el contador
			enabledCounter--;
		}
	}
}

// Obtiene el valor de la variable
bool SmartSprite::isOnDestination()
{
	return onDestination;
}

// Obtiene el valor de la variable
bool SmartSprite::hasFinished()
{
	return finished;
}