#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para shared_ptr
#include <vector>  // Para vector

#include "utils/delta_timer.hpp"  // Para DeltaTimer
class SurfaceSprite;              // Forward declaration
class Surface;                    // Forward declaration

// Estados de la secuencia del logo
enum class LogoState {
    INITIAL,             // Espera inicial
    JAILGAMES_SLIDE_IN,  // Las líneas de JAILGAMES se deslizan hacia el centro
    SINCE_1998_FADE_IN,  // Aparición gradual del texto "Since 1998"
    DISPLAY,             // Logo completo visible
    FADE_OUT,            // Desaparición gradual
    END                  // Fin de la secuencia
};

class Logo {
    public:
        Logo();             // Constructor
        ~Logo() = default;  // Destructor
        void run();         // Bucle principal

    private:
        // --- Constantes de tiempo (en segundos) ---
        static constexpr float INITIAL_DELAY = 0.5F;             // Tiempo antes de que empiece la animación
        static constexpr float JAILGAMES_SLIDE_DURATION = 1.2F;  // Duración del slide-in de JAILGAMES
        static constexpr float SINCE_1998_FADE_DURATION = 0.5F;  // Duración del fade-in de "Since 1998"
        static constexpr float DISPLAY_DURATION = 3.5F;          // Tiempo que el logo permanece visible
        static constexpr float FADE_OUT_DURATION = 0.5F;         // Duración del fade-out final

        // --- Constantes de animación ---
        static constexpr float JAILGAMES_SLIDE_SPEED = 800.0F;  // Velocidad de slide-in (pixels/segundo)
        static constexpr int JAILGAMES_DEST_X = 37;             // Posición X de destino para JAILGAMES

        // --- Objetos y punteros ---
        std::shared_ptr<Surface> jailgames_surface_;                    // Textura con los graficos "JAILGAMES"
        std::shared_ptr<Surface> since_1998_surface_;                   // Textura con los graficos "Since 1998"
        std::vector<std::shared_ptr<SurfaceSprite>> jailgames_sprite_;  // Vector con los sprites de cada linea que forman el bitmap JAILGAMES
        std::shared_ptr<SurfaceSprite> since_1998_sprite_;              // SSprite para manejar la textura2
        Uint8 jailgames_color_ = 0;                                     // Color para el sprite de "JAILGAMES"
        Uint8 since_1998_color_ = 0;                                    // Color para el sprite de "Since 1998"

        // --- Variables de estado ---
        std::vector<Uint8> color_;                 // Vector con los colores para el fadeF
        std::unique_ptr<DeltaTimer> delta_timer_;  // Timer para delta time
        LogoState state_;                          // Estado actual de la secuencia
        float state_time_;                         // Tiempo acumulado en el estado actual

        // --- Funciones ---
        void update();                                // Actualiza las variables
        void render();                                // Dibuja en pantalla
        static void checkEvents();                    // Comprueba el manejador de eventos
        static void checkInput();                     // Comprueba las entradas
        void updateJAILGAMES(float delta_time);       // Gestiona el logo de JAILGAME (time-based)
        void updateTextureColors();                   // Gestiona el color de las texturas
        void updateState(float delta_time);           // Actualiza el estado actual
        void transitionToState(LogoState new_state);  // Transiciona a un nuevo estado
        [[nodiscard]] auto getColorIndex(float progress) const -> int;  // Calcula el índice de color según el progreso (0.0-1.0)
        static void endSection();                     // Termina la sección
        void initColors();                            // Inicializa el vector de colores
        void initSprites();                           // Crea los sprites de cada linea
};