#pragma once

#include <SDL3/SDL.h>

#include <string>  // Para string
#include <vector>  // Para vector
struct Color;      // lines 11-11

class Texture {
    private:
        // Objetos y punteros
        SDL_Renderer* renderer_;          // Renderizador donde dibujar la textura
        SDL_Texture* texture_ = nullptr;  // La textura

        // Variables
        std::string path_;                           // Ruta de la imagen de la textura
        float width_ = 0.0F;                         // Ancho de la imagen
        float height_ = 0.0F;                        // Alto de la imagen
        std::vector<std::vector<Uint32>> palettes_;  // Vector con las diferentes paletas

        // Libera la memoria de la textura
        void unloadTexture();

    public:
        // Constructor
        explicit Texture(SDL_Renderer* renderer, std::string path = std::string());

        // Destructor
        ~Texture();

        // Carga una imagen desde un fichero
        auto loadFromFile(const std::string& path) -> bool;

        // Crea una textura en blanco
        auto createBlank(int width, int height, SDL_PixelFormat format = SDL_PIXELFORMAT_RGBA8888, SDL_TextureAccess access = SDL_TEXTUREACCESS_STREAMING) -> bool;

        // Establece el color para la modulacion
        void setColor(Uint8 red, Uint8 green, Uint8 blue);
        void setColor(Color color);

        // Establece el blending
        void setBlendMode(SDL_BlendMode blending);

        // Establece el alpha para la modulación
        void setAlpha(Uint8 alpha);

        // Renderiza la textura en un punto específico
        void render(float x, float y, SDL_FRect* clip = nullptr, float zoom_w = 1, float zoom_h = 1, double angle = 0.0, SDL_FPoint* center = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);

        // Establece la textura como objetivo de renderizado
        void setAsRenderTarget(SDL_Renderer* renderer);

        // Obtiene el ancho de la imagen
        [[nodiscard]] auto getWidth() const -> int { return width_; }

        // Obtiene el alto de la imagen
        [[nodiscard]] auto getHeight() const -> int { return height_; }

        // Recarga la textura
        auto reLoad() -> bool;

        // Obtiene la textura
        auto getSDLTexture() -> SDL_Texture*;

        // Obtiene el renderizador
        auto getRenderer() -> SDL_Renderer*;
};