#include "const.h"
#include "smartsprite.h"

//Constructor
SmartSprite::SmartSprite()
{
	init();
}

//Destructor
SmartSprite::~SmartSprite()
{
	init();
}

//Inicializador
void SmartSprite::init()
{
	setTexture(nullptr);
	setRenderer(nullptr);

	setPosX(0);
	setPosY(0);
	setWidth(0);
	setHeight(0);

	setVelX(0);
	setVelY(0);
	setAccelX(0);
	setAccelY(0);

	setSpriteClip(0, 0, 0, 0);

	setEnabled(false);
	setEnabledTimer(0);

	mIsOnDestination = false;
	mDestX = 0;
	mDestY = 0;

	//El Id siempre es >=0, por lo tanto si no se le asigna Id se queda en negativo
	mId = -1;

	mIntroEvents = nullptr;
}

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

//Establece el valor de la variable
void SmartSprite::setEnabled(bool state)
{
	mEnabled = state;
}

//Obtiene el valor de la variable
Uint16 SmartSprite::getEnabledTimer()
{
	return mEnabledTimer;
}

//Establece el valor de la variable
void SmartSprite::setEnabledTimer(Uint16 time)
{
	mEnabledTimer = time;
}

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

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

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

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

//Actualiza la posición y comprueba si ha llegado a su destino
bool SmartSprite::update()
{
	if (mEnabled)
	{
		move();

		//Comprueba si se desplaza en el eje X hacia la derecha
		if (getVelX() > 0)
		{
			//Comprueba si hemos llegado al destino
			if (getPosX() > mDestX)
			{
				//Lo coloca en posición
				setPosX(mDestX);

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

		//Comprueba si se desplaza en el eje X hacia la izquierda
		else if (getVelX() < 0)
		{
			//Comprueba si hemos llegado al destino
			if (getPosX() < mDestX)
			{
				//Lo coloca en posición
				setPosX(mDestX);

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

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

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

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

		//Comprueba si ha llegado a su destino
		if ((getPosX() == mDestX) && (getPosY() == mDestY))
		{
			mIsOnDestination = true;
		}
		else
		{
			mIsOnDestination = false;
		}

		//Si esta en el destino comprueba su contador
		if (mIsOnDestination)
		{
			//Si el contador es mayor que cero, lo decrementa
			if (mEnabledTimer > 0)
			{
				--mEnabledTimer;
			}
			//Si ha llegado a cero, deshabilita el objeto o manda el aviso en función de si tiene Id
			else if (mEnabledTimer == 0)
			{
				if (mId < 0)
				{
					mEnabled = false;
				}
				else
				{
					mIntroEvents[mId] = EVENT_COMPLETED;
				}
			}
		}
	}

	return mIsOnDestination;
}

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

//Pinta el objeto en pantalla
void SmartSprite::render()
{
	if (mEnabled)
	{
		MovingSprite::render();
	}
}

//Establece el valor de la variable
void SmartSprite::setId(int id)
{
	mId = id;
}

//Establece el valor de la variable
void SmartSprite::setIntroEvents(Uint8 *value)
{
	mIntroEvents = value;
}