#pragma once

#include <SDL3/SDL.h>  // Para SDL_FPoint, Uint64

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

#include "utils/color.hpp"  // for Color

class Sprite;
class Texture;

// --- Clase Logo: pantalla de presentación de JAILGAMES con efectos retro ---
//
// Esta clase gestiona el estado inicial del programa, mostrando el logo corporativo
// de JAILGAMES con efectos visuales inspirados en el ZX Spectrum.
//
// Funcionalidades principales:
// • Animación de convergencia: cada línea del logo entra desde los laterales
// • Efectos de color: transiciones automáticas usando la paleta ZX Spectrum
// • Audio sincronizado: reproduce sonido del logo en momento específico
// • Transición temporal: duración controlada con paso automático al siguiente estado
// • Sistema delta-time: animaciones suaves independientes del framerate
//
// La clase utiliza un sistema de tiempo basado en segundos para garantizar
// consistencia visual en diferentes velocidades de procesamiento.

class Logo {
   public:
    // --- Constructor y destructor ---
    Logo();
    ~Logo();

    // --- Callbacks para el bucle SDL_MAIN_USE_CALLBACKS ---
    void iterate();                            // Ejecuta un frame
    void handleEvent(const SDL_Event& event);  // Procesa un evento

    // --- Bucle principal legacy (fallback) ---
    void run();

   private:
    // --- Constantes de tiempo (en segundos) ---
    static constexpr float SOUND_TRIGGER_TIME_S = 0.5F;        // Tiempo para activar el sonido del logo
    static constexpr float SHOW_SINCE_SPRITE_TIME_S = 1.167F;  // Tiempo para mostrar el sprite "SINCE 1998"
    static constexpr float INIT_FADE_TIME_S = 5.0F;            // Tiempo de inicio del fade a negro
    static constexpr float END_LOGO_TIME_S = 6.668F;           // Tiempo de finalización del logo
    static constexpr float POST_LOGO_DURATION_S = 0.333F;      // Duración adicional después del fade
    static constexpr float LOGO_SPEED_PX_PER_S = 480.0F;       // Velocidad de desplazamiento (píxeles por segundo) - 8.0f/16.67f*1000
    static constexpr float COLOR_CHANGE_INTERVAL_S = 0.0667F;  // Intervalo entre cambios de color (~4 frames a 60fps)

    // --- Constantes de layout ---
    static constexpr int SINCE_SPRITE_Y_OFFSET = 83;  // Posición Y base del sprite "Since 1998"
    static constexpr int LOGO_SPACING = 5;            // Espaciado entre elementos del logo
    static constexpr int LINE_OFFSET_FACTOR = 3;      // Factor de desplazamiento inicial por línea
    static constexpr int SPRITE_LINE_HEIGHT = 1;      // Altura de cada línea sprite

    // --- Constantes de colores ---
    static constexpr int MAX_SINCE_COLOR_INDEX = 7;  // Índice máximo para colores del sprite "Since"
    static constexpr int MAX_FADE_COLOR_INDEX = 6;   // Índice máximo para colores del fade

    // --- Paleta ZX Spectrum para efectos de logo ---
    static constexpr Color SPECTRUM_BLACK = Color(0x00, 0x00, 0x00);    // Negro
    static constexpr Color SPECTRUM_BLUE = Color(0x00, 0x00, 0xd8);     // Azul
    static constexpr Color SPECTRUM_RED = Color(0xd8, 0x00, 0x00);      // Rojo
    static constexpr Color SPECTRUM_MAGENTA = Color(0xd8, 0x00, 0xd8);  // Magenta
    static constexpr Color SPECTRUM_GREEN = Color(0x00, 0xd8, 0x00);    // Verde
    static constexpr Color SPECTRUM_CYAN = Color(0x00, 0xd8, 0xd8);     // Cian
    static constexpr Color SPECTRUM_YELLOW = Color(0xd8, 0xd8, 0x00);   // Amarillo
    static constexpr Color SPECTRUM_WHITE = Color(0xFF, 0xFF, 0xFF);    // Blanco brillante
    static constexpr Color RESET_COLOR = Color(255, 255, 255);          // Color de reset

    // --- Objetos y punteros ---
    std::shared_ptr<Texture> since_texture_;            // Textura con los gráficos "Since 1998"
    std::unique_ptr<Sprite> since_sprite_;              // Sprite para manejar la since_texture
    std::shared_ptr<Texture> jail_texture_;             // Textura con los gráficos "JAILGAMES"
    std::vector<std::unique_ptr<Sprite>> jail_sprite_;  // Vector con los sprites de cada línea que forman el bitmap JAILGAMES

    // --- Variables ---
    std::vector<Color> color_;      // Vector con los colores para el fade
    float elapsed_time_s_ = 0.0F;   // Tiempo transcurrido en segundos
    Uint64 last_time_ = 0;          // Último timestamp para calcular delta-time
    SDL_FPoint dest_;               // Posición donde dibujar el logo
    bool sound_triggered_ = false;  // Indica si el sonido del logo ya se reprodujo

    // --- Métodos internos ---
    void update(float delta_time);               // 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 JAILGAMES
    void renderJAILGAMES();                      // Renderiza el logo de JAILGAMES
    void updateTextureColors(float delta_time);  // Gestiona el color de las texturas
    void handleSound();                          // Maneja la reproducción del sonido del logo
    auto calculateDeltaTime() -> float;          // Calcula el tiempo transcurrido desde el último frame
};
