#pragma once

#include <SDL3/SDL.h>

#include <cstdint>     // Para uint8_t
#include <functional>  // Para std::function
#include <memory>      // Para shared_ptr
#include <vector>      // Para vector

#include "game/scenes/scene.hpp"  // Para Scene
#include "utils/delta_timer.hpp"  // Para DeltaTimer
class Sprite;                     // Forward declaration
class Surface;                    // Forward declaration

class Logo : public Scene {
   public:
    // --- Tipos ---
    using EasingFunction = std::function<float(float)>;  // Función de easing (permite lambdas)

    // --- Enumeraciones ---
    enum class State : std::uint8_t {
        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
        BLACK_SCREEN,        // Pantalla en negro antes de terminar
        END                  // Fin de la secuencia
    };

    // --- Constructor y Destructor ---
    Logo();
    ~Logo() override = default;

    // --- Bucle principal (SDL3 Callback API) ---
    void iterate() override;
    void handleEvent(const SDL_Event& event) override;

   private:
    // --- Constantes de tiempo (en segundos) ---
    static constexpr float INITIAL_DELAY = 0.5F;             // Tiempo antes de que empiece la animación
    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
    static constexpr float BLACK_SCREEN_DURATION = 1.0F;     // Duración de la pantalla negra final

    // --- Constantes de animación ---
    static constexpr float JAILGAMES_SLIDE_DURATION = 0.8F;  // Duración de la animación de slide-in (segundos)
    static constexpr int JAILGAMES_DEST_X = 37;              // Posición X de destino para JAILGAMES

    // --- Métodos ---
    void update();                                                  // Actualiza las variables
    void render();                                                  // Dibuja en pantalla
    static void handleInput();                                      // 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(State 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

    // --- Variables miembro ---
    // Objetos y punteros a recursos
    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<Sprite>> jailgames_sprite_;  // Vector con los sprites de cada linea que forman el bitmap JAILGAMES
    std::vector<int> jailgames_initial_x_;                   // Posiciones X iniciales de cada línea (para interpolación con easing)
    std::shared_ptr<Sprite> since_1998_sprite_;              // SSprite para manejar la textura2
    std::unique_ptr<DeltaTimer> delta_timer_;                // Timer para delta time

    // Variables de estado de colores
    std::vector<Uint8> color_;   // Vector con los colores para el fade
    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 de la secuencia
    State state_{State::INITIAL};     // Estado actual de la secuencia
    float state_time_{0.0F};          // Tiempo acumulado en el estado actual
    EasingFunction easing_function_;  // Función de easing para la animación del logo
};