#pragma once

#include <SDL3/SDL.h>

#include <vector>  // for vector
class SmartSprite;
class Text;
class Texture;
class Writer;
struct Section;
namespace Ja {
    struct Music;
}  // namespace Ja

// Clase Intro
class Intro {
   public:
    Intro(SDL_Renderer *renderer, Section *section);  // Constructor
    ~Intro();                                         // Destructor

    Intro(const Intro &) = delete;
    auto operator=(const Intro &) -> Intro & = delete;

    void run();                                // Bucle principal
    void iterate();                            // Ejecuta un frame
    void handleEvent(const SDL_Event *event);  // Procesa un evento

   private:
    // Objetos y punteros
    SDL_Renderer *renderer_;              // El renderizador de la ventana
    Texture *texture_;                    // Textura con los graficos
    SDL_Event *event_handler_;            // Manejador de eventos
    std::vector<SmartSprite *> bitmaps_;  // Vector con los sprites inteligentes para los dibujos de la intro
    std::vector<Writer *> texts_;         // Textos de la intro
    Text *text_;                          // Textos de la intro
    Section *section_;                    // Estado del bucle principal para saber si continua o se sale

    // Variables
    Uint32 ticks_;       // Contador de ticks para ajustar la velocidad del programa
    Uint8 ticks_speed_;  // Velocidad a la que se repiten los bucles del programa
    Ja::Music *music_;  // Musica para la intro
    int scene_;          // Indica que escena está activa

    void update();        // Actualiza las variables del objeto
    void render();        // Dibuja el objeto en pantalla
    void checkInput();    // Comprueba las entradas
    void updateScenes();  // Actualiza las escenas de la intro

    // Helpers de updateScenes, uno por cada escena
    void updateScene1();
    void updateScene2();
    void updateScene3();
    void updateScene4();
    void updateScene5();
    void updateScene6();
};
