#pragma once

#include <SDL3/SDL.h>

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

#include "game/scenes/scene.hpp"  // Para Scene
class AnimatedSprite;             // lines 7-7
class DeltaTimer;                 // Forward declaration

class GameOver : public Scene {
   public:
    // Constructor y Destructor
    GameOver();
    ~GameOver() override = default;

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

   private:
    // --- Enumeraciones ---
    enum class State : std::uint8_t {
        WAITING,    // Espera inicial antes de empezar
        FADE_IN,    // Fade in de colores desde black
        DISPLAY,    // Mostrando contenido con color brillante
        FADE_OUT,   // Fade out hacia black
        ENDING,     // Pantalla en negro antes de salir
        TRANSITION  // Cambio a logo
    };

    // --- Constantes de duración (segundos) ---
    static constexpr float WAITING_DURATION = 0.8F;    // Espera inicial
    static constexpr float FADE_IN_DURATION = 0.32F;   // Duración del fade in
    static constexpr float DISPLAY_DURATION = 4.64F;   // Duración mostrando contenido
    static constexpr float FADE_OUT_DURATION = 0.32F;  // Duración del fade out
    static constexpr float ENDING_DURATION = 1.12F;    // Espera en negro antes de salir

    // --- Constantes de posición ---
    static constexpr int TEXT_Y = 32;                     // Posición Y del texto principal
    static constexpr int SPRITE_Y_OFFSET = 30;            // Offset Y para sprites desde TEXT_Y
    static constexpr int PLAYER_X_OFFSET = 10;            // Offset X del jugador desde el centro
    static constexpr int TV_X_OFFSET = 10;                // Offset X del TV desde el centro
    static constexpr int ITEMS_Y_OFFSET = 80;             // Offset Y del texto de items desde TEXT_Y
    static constexpr int ROOMS_Y_OFFSET = 90;             // Offset Y del texto de rooms desde TEXT_Y
    static constexpr int NIGHTMARE_TITLE_Y_OFFSET = 110;  // Offset Y del título nightmare desde TEXT_Y
    static constexpr int NIGHTMARE_TEXT_Y_OFFSET = 120;   // Offset Y del texto nightmare desde TEXT_Y

    // --- Métodos ---
    void update();              // Actualiza el objeto
    void render();              // Dibuja el final en pantalla
    static void handleInput();  // Comprueba las entradas
    void updateState();         // Actualiza el estado y transiciones
    void updateColor();         // Actualiza el color usado para renderizar
    void renderSprites();       // Dibuja los sprites

    // --- Variables miembro ---
    // Objetos y punteros a recursos
    std::shared_ptr<AnimatedSprite> player_sprite_;  // Sprite con el jugador
    std::shared_ptr<AnimatedSprite> tv_sprite_;      // Sprite con el televisor
    std::shared_ptr<DeltaTimer> delta_timer_;        // Timer para time-based logic

    // Variables de estado de la escena
    State state_{State::WAITING};  // Estado actual de la escena
    float elapsed_time_{0.0F};     // Tiempo transcurrido en el estado actual

    // Variables de efectos visuales
    std::vector<Uint8> colors_;  // Vector con los colores para el fade
    Uint8 color_{0};             // Color actual para texto y sprites
};