#pragma once

#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <memory>

#include "texture.h"
#include "animated_sprite.h"
#include "smart_sprite.h"
#include "sprite.h"

struct JA_Sound_t;

// Clase GameLogo
class GameLogo
{
private:
    // Objetos y punteros
    std::shared_ptr<Texture> dustTexture;          // Textura con los graficos del polvo
    std::shared_ptr<Texture> coffeeTexture;        // Textura con los graficos de la palabra "COFFEE"
    std::shared_ptr<Texture> crisisTexture;        // Textura con los graficos de la plabra "CRISIS"
    std::shared_ptr<Texture> arcadeEditionTexture; // Textura con los graficos de "Arcade Edition"

    std::unique_ptr<AnimatedSprite> dustLSprite; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo
    std::unique_ptr<AnimatedSprite> dustRSprite; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo

    std::unique_ptr<SmartSprite> coffeeSprite; // Sprite con la palabra "COFFEE" para la pantalla de titulo
    std::unique_ptr<SmartSprite> crisisSprite; // Sprite con la palabra "CRISIS" para la pantalla de titulo

    std::unique_ptr<Sprite> arcadeEditionSprite; // Sprite con los graficos de "Arcade Edition"

    JA_Sound_t *crashSound; // Sonido con el impacto del título

    // Variables
    int x; // Posición donde dibujar el logo
    int y; // Posición donde dibujar el logo

    enum class Status
    {
        DISABLED,
        MOVING,
        SHAKING,
        FINISHED,
    } status; // Estado en el que se encuentra la clase

    struct Shake
    {
        int desp;      // Pixels de desplazamiento para agitar la pantalla en el eje x
        int delay;     // Retraso entre cada desplazamiento de la pantalla al agitarse
        int counter;   // Contador para el retraso
        int lenght;    // Cantidad de desplazamientos a realizar
        int remaining; // Cantidad de desplazamientos pendientes a realizar
        int origin;    // Valor inicial de la pantalla para dejarla igual tras el desplazamiento
    } shake;           // Estructura para generar el efecto de agitación

    // Inicializa las variables
    void init();

    // Calcula el desplazamiento vertical inicial
    int getInitialVerticalDesp();

public:
    // Constructor
    GameLogo(int x, int y);

    // Destructor
    ~GameLogo();

    // Pinta la clase en pantalla
    void render();

    // Actualiza la lógica de la clase
    void update();

    // Activa la clase
    void enable();

    // Indica si ha terminado la animación
    bool hasFinished() const;

    // Recarga las texturas
    void reLoad();
};