#pragma once

#include <SDL2/SDL.h>
#include "movingsprite.h"
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>

#ifndef ANIMATEDSPRITE_H
#define ANIMATEDSPRITE_H

// Clase AnimatedSprite
class AnimatedSprite : public MovingSprite
{
private:
    struct t_animation
    {
        std::string name;             // Nombre de la animacion
        std::vector<SDL_Rect> frames; // Cada uno de los frames que componen la animación
        int speed;                    // Velocidad de la animación
        int loop;                     // Indica a que frame vuelve la animación al terminar. -1 para que no vuelva
        bool completed;               // Indica si ha finalizado la animación
        int currentFrame;             // Frame actual
        int counter;                  // Contador para las animaciones
    };
    std::vector<t_animation> animation; // Vector con las diferentes animaciones
    int currentAnimation;               // Animacion activa

public:
    // Constructor
    AnimatedSprite(LTexture *texture = nullptr, SDL_Renderer *renderer = nullptr, std::string file = "", std::vector<std::string> *buffer = nullptr);

    // Destructor
    ~AnimatedSprite();

    // Calcula el frame correspondiente a la animación actual
    void animate();

    // Establece el frame actual de la animación
    void setCurrentFrame(int num);

    // Establece el valor del contador
    void setAnimationCounter(std::string name, int num);

    // Establece la velocidad de una animación
    void setAnimationSpeed(std::string name, int speed);
    void setAnimationSpeed(int index, int speed);

    // Establece el frame al que vuelve la animación al finalizar
    void setAnimationLoop(std::string name, int loop);
    void setAnimationLoop(int index, int loop);

    // Establece el valor de la variable
    void setAnimationCompleted(std::string name, bool value);
    void setAnimationCompleted(int index, bool value);

    // Comprueba si ha terminado la animación
    bool animationIsCompleted();

    // Devuelve el rectangulo de una animación y frame concreto
    SDL_Rect getAnimationClip(std::string name, Uint8 index);
    SDL_Rect getAnimationClip(int indexA, Uint8 indexF);

    // Obtiene el indice de la animación a partir del nombre
    int getIndex(std::string name);

    // Carga la animación desde un fichero
    bool loadFromFile(std::string filePath);

    // Carga la animación desde un vector
    bool loadFromVector(std::vector<std::string> *source);

    // Establece la animacion actual
    void setCurrentAnimation(std::string name = "default");
    void setCurrentAnimation(int index = 0);

    // Actualiza las variables del objeto
    void update();

    // OLD - Establece el rectangulo para un frame de una animación
    void setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h);

    // OLD - Establece el contador para todas las animaciones
    void setAnimationCounter(int value);

    // Reinicia la animación
    void resetAnimation();
};

#endif