#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 {
   private:
    SDL_Renderer *mRenderer = nullptr;                     // El renderizador de la ventana
    SDL_Texture *mBackbuffer = nullptr;                    // Textura para usar como backbuffer
    Uint8 mFadeType = FADE_FULLSCREEN;                     // Tipo de fade a realizar
    Uint16 mCounter = 0;                                   // Contador interno
    bool mEnabled = false;                                 // Indica si el fade está activo
    bool mFinished = false;                                // Indica si ha terminado la transición
    Uint8 mR = 0, mG = 0, mB = 0;                          // Colores para el fade
    Uint8 mROriginal = 0, mGOriginal = 0, mBOriginal = 0;  // Colores originales para FADE_RANDOM_SQUARE
    Uint32 mLastSquareTicks = 0;                           // Ticks del último cuadrado dibujado (FADE_RANDOM_SQUARE)
    Uint16 mSquaresDrawn = 0;                              // Número de cuadrados dibujados (FADE_RANDOM_SQUARE)
    bool mFullscreenDone = false;                          // Indica si el fade fullscreen ha terminado la fase de fundido
    SDL_Rect mRect1{};                                     // Rectangulo usado para crear los efectos de transición
    SDL_Rect mRect2{};                                     // Rectangulo usado para crear los efectos de transición

   public:
    // Constructor
    explicit Fade(SDL_Renderer *renderer);

    // Destructor
    ~Fade();

    // Inicializa las variables
    void init(Uint8 r, Uint8 g, Uint8 b);

    // Pinta una transición en pantalla
    void render();

    // Actualiza las variables internas
    void update();

    // Activa el fade
    void activateFade();

    // Comprueba si ha terminado la transicion
    bool hasEnded();

    // Comprueba si está activo
    bool isEnabled();

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