#pragma once

#include <memory>            // Para unique_ptr, shared_ptr
#include "animated_sprite.h" // Para AnimatedSprite
#include "smart_sprite.h"    // Para SmartSprite
#include "sprite.h"          // Para Sprite
class Texture;               // lines 7-7

// Clase GameLogo
class GameLogo
{
private:
    enum class Status
    {
        DISABLED,
        MOVING,
        SHAKING,
        FINISHED,
    };

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

    // Objetos y punteros
    std::shared_ptr<Texture> dust_texture_;           // Textura con los graficos del polvo
    std::shared_ptr<Texture> coffee_texture_;         // Textura con los graficos de la palabra "COFFEE"
    std::shared_ptr<Texture> crisis_texture_;         // Textura con los graficos de la plabra "CRISIS"
    std::shared_ptr<Texture> arcade_edition_texture_; // Textura con los graficos de "Arcade Edition"

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

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

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

    // Variables
    int x_; // Posición donde dibujar el logo
    int y_; // Posición donde dibujar el logo

    Status status_; // Estado en el que se encuentra la clase
    Shake 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() = default;

    // 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();
};