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

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

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

// Inicializador
void SmartSprite::init(LTexture *texture, SDL_Renderer *renderer)
{
	setTexture(texture);
	setRenderer(renderer);

	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;
}

// Pone a cero los elementos del objeto
void SmartSprite::erase()
{
	init(nullptr, 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 ((getAccelX() > 0) || ((getAccelX() == 0) && (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 ((getAccelX() < 0) || ((getAccelX() == 0) && (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 ((getAccelY() > 0) || ((getAccelY() == 0) && (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 ((getAccelY() < 0) || ((getAccelY() == 0) && (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;
}