#pragma once

#include <SDL2/SDL_rect.h> // for SDL_Rect, SDL_Point
#include "texture.h"
#include <memory>

// Clase sprite
class 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

    std::shared_ptr<Texture> texture_; // Textura donde estan todos los dibujos del sprite
    SDL_Rect spriteClip_;              // Rectangulo de origen de la textura que se dibujará en pantalla

    bool enabled_; // Indica si el sprite esta habilitado

public:
    // Constructor
    Sprite(int x = 0, int y = 0, int w = 0, int h = 0, std::shared_ptr<Texture> texture = nullptr);
    Sprite(SDL_Rect rect, std::shared_ptr<Texture> texture = nullptr);

    // Destructor
    ~Sprite() = default;

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

    // Obten el valor de la variable
    int getPosX() const;
    int getPosY() const;
    int getWidth() const;
    int getHeight() const;

    // Establece la posición del objeto
    void setPos(int x, int y);
    void setPos(SDL_Point p);
    void setPos(SDL_Rect r);

    // Devuelve el rectangulo donde está el sprite
    SDL_Rect getRect() const;

    // Establece el valor de la variable
    void setPosX(int x);
    void setPosY(int y);
    void setWidth(int w);
    void setHeight(int h);

    // Incrementa el valor de la variable
    void incPosX(int value);
    void incPosY(int value);

    // Obten el valor de la variable
    SDL_Rect getSpriteClip() const;

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

    // Obten el valor de la variable
    std::shared_ptr<Texture> getTexture() const;

    // Establece el valor de la variable
    void setTexture(std::shared_ptr<Texture> texture);

    // Establece el valor de la variable
    void setEnabled(bool value);

    // Comprueba si el objeto está habilitado
    bool isEnabled() const;

};