#pragma once

#include <SDL3/SDL.h>

#include <vector>  // for vector
class SmartSprite;
class Text;
class Texture;
class Writer;
struct JA_Music_t;
struct section_t;

// Clase Intro
class Intro {
   private:
    // Objetos y punteros
    SDL_Renderer *renderer;              // El renderizador de la ventana
    Texture *texture;                    // Textura con los graficos
    SDL_Event *eventHandler;             // 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_t *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 ticksSpeed;   // Velocidad a la que se repiten los bucles del programa
    JA_Music_t *music;  // Musica para la intro
    int scene;          // Indica que escena está activa

    // Actualiza las variables del objeto
    void update();

    // Dibuja el objeto en pantalla
    void render();

    // Comprueba las entradas
    void checkInput();

    // Actualiza las escenas de la intro
    void updateScenes();

   public:
    // Constructor
    Intro(SDL_Renderer *renderer, section_t *section);

    // Destructor
    ~Intro();

    Intro(const Intro &) = delete;
    Intro &operator=(const Intro &) = delete;

    // Bucle principal
    void run();

    // Ejecuta un frame
    void iterate();

    // Procesa un evento
    void handleEvent(const SDL_Event *event);
};
