#pragma once

#include <SDL2/SDL.h>
#include <stdio.h>
#include <string>

#ifndef LTEXTURE_H
#define LTEXTURE_H

// Clase LTexture
class LTexture
{
private:
    SDL_Texture *texture;   // La textura
    SDL_Renderer *renderer; // Renderizador donde dibujar la textura
    int width;              // Ancho de la imagen
    int height;             // Alto de la imagen
    std::string path;       // Ruta de la imagen de la textura

public:
    // Constructor
    LTexture(SDL_Renderer *renderer, std::string path = "");

    // Destructor
    ~LTexture();

    // Carga una imagen desde un fichero
    bool loadFromFile(std::string path, SDL_Renderer *renderer);

    // Crea una textura en blanco
    bool createBlank(SDL_Renderer *renderer, int width, int height, SDL_TextureAccess = SDL_TEXTUREACCESS_STREAMING);

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

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

    // 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(SDL_Renderer *renderer, int x, int y, SDL_Rect *clip = NULL, float zoomW = 1, float zoomH = 1, double angle = 0.0, SDL_Point *center = NULL, SDL_RendererFlip flip = SDL_FLIP_NONE);

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

    // Obtiene el ancho de la imagen
    int getWidth();

    // Obtiene el alto de la imagen
    int getHeight();

    // Recarga la textura
    bool reLoad();
};

#endif
