//#include "const.h"
#include "animatedsprite.h"
//#include <iostream>

// Constructor
AnimatedSprite::AnimatedSprite()
{
	MovingSprite::init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr);
	init(nullptr, nullptr);
}

// Destructor
AnimatedSprite::~AnimatedSprite()
{
	MovingSprite::init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr);
	init(nullptr, nullptr);
}

// Iniciador
void AnimatedSprite::init(LTexture *texture, SDL_Renderer *renderer)
{
	mRenderer = renderer;
	mTexture = texture;

	for (Uint8 i = 0; i < 20; i++)
	{
		mAnimation[i].numFrames = 0;
		mAnimation[i].speed = 0;
		mAnimation[i].loop = true;
		mAnimation[i].currentFrame = 0;
		mAnimation[i].counter = 0;
		for (Uint8 j = 0; i < 50; i++)
		{
			mAnimation[i].frame[j].x = 0;
			mAnimation[i].frame[j].y = 0;
			mAnimation[i].frame[j].w = 0;
			mAnimation[i].frame[j].h = 0;
		}
	}

	mCurrentAnimation = 0;
}

// Calcula el frame correspondiente a la animación
void AnimatedSprite::animate(int index)
{
	// Calculamos el frame actual a partir del contador
	mAnimation[index].currentFrame = mAnimation[index].counter / mAnimation[index].speed;

	// Final de la animación
	if (mAnimation[index].currentFrame >= mAnimation[index].numFrames)
	{
		// Si se reproduce en bucle
		if (mAnimation[index].loop)
		{
			// Reiniciamos el contador de la animación
			mAnimation[index].counter = 0;
		}
		else
		{
			// Mantenemos el ultimo frame
			mAnimation[index].currentFrame = mAnimation[index].numFrames;
		}
	}
	// La animación no ha llegado a su fin
	else
	{
		// Establece el frame correspondiente de la animación
		setSpriteClip(mAnimation[index].frame[mAnimation[index].currentFrame]);

		// Incrementa el contador de la animacion
		mAnimation[index].counter++;
	}
}

// Actualiza todas las variables del objeto: posición, velocidad y animación
void AnimatedSprite::update()
{
	MovingSprite::update();
	animate(mCurrentAnimation);
}

// Establece el frame actual de la animación
void AnimatedSprite::setCurrentFrame(Uint8 index, Uint8 num)
{
	mAnimation[index].currentFrame = num;
}

// Establece el valor del contador
void AnimatedSprite::setAnimationCounter(Uint8 index, Uint16 num)
{
	mAnimation[index].counter = num;
}

// Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index, Uint8 frame, int x, int y, int w, int h)
{
	mAnimation[index].frame[frame].y = y;
	mAnimation[index].frame[frame].w = w;
	mAnimation[index].frame[frame].h = h;
	mAnimation[index].frame[frame].x = x;
}

// Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index, Uint8 frame, SDL_Rect rect)
{
	mAnimation[index].frame[frame] = rect;
}

// Establece la velocidad de una animación
void AnimatedSprite::setAnimationSpeed(Uint8 index, Uint8 speed)
{
	mAnimation[index].speed = speed;
}

// Establece el numero de frames de una animación
void AnimatedSprite::setAnimationNumFrames(Uint8 index, Uint8 num)
{
	if (num < MAX_FRAMES)
		mAnimation[index].numFrames = num;
}

// Establece si la animación se reproduce en bucle
void AnimatedSprite::setAnimationLoop(Uint8 index, bool loop)
{
	mAnimation[index].loop = loop;
}

// Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(Uint8 index, Uint8 frame)
{
	return mAnimation[index].frame[frame];
}

// Establece la animación actual
void AnimatedSprite::setCurrentAnimation(Uint8 index)
{
	if (index < MAX_ANIMATIONS)
		mCurrentAnimation = index;
}

// Obtiene la animación actual
Uint8 AnimatedSprite::getCurrentAnimation()
{
	return mCurrentAnimation;
}