#pragma once

#include <SDL3/SDL.h>
class Texture;

// Clase sprite
class Sprite {
   public:
    explicit Sprite(int x = 0, int y = 0, int w = 0, int h = 0, Texture *texture = nullptr, SDL_Renderer *renderer = nullptr);  // Constructor
    Sprite(SDL_Rect rect, Texture *texture, SDL_Renderer *renderer);

    virtual ~Sprite();  // Destructor

    virtual void render();  // Muestra el sprite por pantalla

    [[nodiscard]] auto getPosX() const -> int;    // Obten el valor de la variable
    [[nodiscard]] auto getPosY() const -> int;    // Obten el valor de la variable
    [[nodiscard]] auto getWidth() const -> int;   // Obten el valor de la variable
    [[nodiscard]] auto getHeight() const -> int;  // Obten el valor de la variable

    void setPos(SDL_Rect rect);  // Establece la posición del objeto
    void setPosX(int x);         // Establece el valor de la variable
    void setPosY(int y);         // Establece el valor de la variable
    void setWidth(int w);        // Establece el valor de la variable
    void setHeight(int h);       // Establece el valor de la variable

    auto getSpriteClip() -> SDL_Rect;                // Obten el valor de la variable
    void setSpriteClip(SDL_Rect rect);               // Establece el valor de la variable
    void setSpriteClip(int x, int y, int w, int h);  // Establece el valor de la variable

    auto getTexture() -> Texture *;     // Obten el valor de la variable
    void setTexture(Texture *texture);  // Establece el valor de la variable

    auto getRenderer() -> SDL_Renderer *;      // Obten el valor de la variable
    void setRenderer(SDL_Renderer *renderer);  // Establece el valor de la variable

    virtual void setEnabled(bool value);  // Establece el valor de la variable
    virtual auto isEnabled() -> bool;     // Comprueba si el objeto está habilitado

    virtual auto getRect() -> SDL_Rect;   // Devuelve el rectangulo donde está el sprite
    virtual void setRect(SDL_Rect rect);  // Establece los valores de posición y tamaño del sprite

   protected:
    int x_;  // Posición en el eje X donde dibujar el sprite
    int y_;  // Posición en el eje Y donde dibujar el sprite
    int w_;  // Ancho del sprite
    int h_;  // Alto del sprite

    SDL_Renderer *renderer_;  // Puntero al renderizador de la ventana
    Texture *texture_;        // Textura donde estan todos los dibujos del sprite
    SDL_Rect sprite_clip_;    // Rectangulo de origen de la textura que se dibujará en pantalla

    bool enabled_;  // Indica si el sprite esta habilitado
};
