#pragma once

#include <SDL3/SDL.h>

// Tipos de fundido
constexpr int FADE_FULLSCREEN = 0;
constexpr int FADE_CENTER = 1;
constexpr int FADE_RANDOM_SQUARE = 2;

// Clase Fade
class Fade {
   public:
    explicit Fade(SDL_Renderer *renderer);  // Constructor
    ~Fade();                                // Destructor

    void init(Uint8 r, Uint8 g, Uint8 b);  // Inicializa las variables
    void render();                         // Pinta una transición en pantalla
    void update();                         // Actualiza las variables internas
    void activateFade();                   // Activa el fade

    [[nodiscard]] auto hasEnded() const -> bool;   // Comprueba si ha terminado la transicion
    [[nodiscard]] auto isEnabled() const -> bool;  // Comprueba si está activo

    void setFadeType(Uint8 fade_type);  // Establece el tipo de fade

   private:
    SDL_Renderer *renderer_ = nullptr;                        // El renderizador de la ventana
    SDL_Texture *backbuffer_ = nullptr;                       // Textura para usar como backbuffer
    Uint8 fade_type_ = FADE_FULLSCREEN;                       // Tipo de fade a realizar
    Uint16 counter_ = 0;                                      // Contador interno
    bool enabled_ = false;                                    // Indica si el fade está activo
    bool finished_ = false;                                   // Indica si ha terminado la transición
    Uint8 r_ = 0, g_ = 0, b_ = 0;                             // Colores para el fade
    Uint8 r_original_ = 0, g_original_ = 0, b_original_ = 0;  // Colores originales para FADE_RANDOM_SQUARE
    Uint32 last_square_ticks_ = 0;                            // Ticks del último cuadrado dibujado (FADE_RANDOM_SQUARE)
    Uint16 squares_drawn_ = 0;                                // Número de cuadrados dibujados (FADE_RANDOM_SQUARE)
    bool fullscreen_done_ = false;                            // Indica si el fade fullscreen ha terminado la fase de fundido
    SDL_Rect rect1_{};                                        // Rectangulo usado para crear los efectos de transición
    SDL_Rect rect2_{};                                        // Rectangulo usado para crear los efectos de transición
};
