#include "core/rendering/sprite.h"

#include "core/rendering/texture.h"  // for Texture

// Constructor
Sprite::Sprite(int x, int y, int w, int h, Texture *texture, SDL_Renderer *renderer)
    : x(x),
      y(y),
      w(w),
      h(h),
      renderer(renderer),
      texture(texture),
      spriteClip{0, 0, w, h},
      enabled(true) {
}

Sprite::Sprite(SDL_Rect rect, Texture *texture, SDL_Renderer *renderer)
    : x(rect.x),
      y(rect.y),
      w(rect.w),
      h(rect.h),
      renderer(renderer),
      texture(texture),
      spriteClip{0, 0, rect.w, rect.h},
      enabled(true) {
}

// Destructor
Sprite::~Sprite() {
    texture = nullptr;
    renderer = nullptr;
}

// Muestra el sprite por pantalla
void Sprite::render() {
    if (enabled) {
        texture->render(renderer, x, y, &spriteClip);
    }
}

// Obten el valor de la variable
int Sprite::getPosX() {
    return x;
}

// Obten el valor de la variable
int Sprite::getPosY() {
    return y;
}

// Obten el valor de la variable
int Sprite::getWidth() {
    return w;
}

// Obten el valor de la variable
int Sprite::getHeight() {
    return h;
}

// Establece la posición del objeto
void Sprite::setPos(SDL_Rect rect) {
    this->x = rect.x;
    this->y = rect.y;
}

// Establece el valor de la variable
void Sprite::setPosX(int x) {
    this->x = x;
}

// Establece el valor de la variable
void Sprite::setPosY(int y) {
    this->y = y;
}

// Establece el valor de la variable
void Sprite::setWidth(int w) {
    this->w = w;
}

// Establece el valor de la variable
void Sprite::setHeight(int h) {
    this->h = h;
}

// Obten el valor de la variable
SDL_Rect Sprite::getSpriteClip() {
    return spriteClip;
}

// Establece el valor de la variable
void Sprite::setSpriteClip(SDL_Rect rect) {
    spriteClip = rect;
}

// Establece el valor de la variable
void Sprite::setSpriteClip(int x, int y, int w, int h) {
    spriteClip = {x, y, w, h};
}

// Obten el valor de la variable
Texture *Sprite::getTexture() {
    return texture;
}

// Establece el valor de la variable
void Sprite::setTexture(Texture *texture) {
    this->texture = texture;
}

// Obten el valor de la variable
SDL_Renderer *Sprite::getRenderer() {
    return renderer;
}

// Establece el valor de la variable
void Sprite::setRenderer(SDL_Renderer *renderer) {
    this->renderer = renderer;
}

// Establece el valor de la variable
void Sprite::setEnabled(bool value) {
    enabled = value;
}

// Comprueba si el objeto está habilitado
bool Sprite::isEnabled() {
    return enabled;
}

// Devuelve el rectangulo donde está el sprite
SDL_Rect Sprite::getRect() {
    SDL_Rect rect = {x, y, w, h};
    return rect;
}

// Establece los valores de posición y tamaño del sprite
void Sprite::setRect(SDL_Rect rect) {
    x = rect.x;
    y = rect.y;
    w = rect.w;
    h = rect.h;
}