#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),
      sprite_clip_{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),
      sprite_clip_{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_, &sprite_clip_);
    }
}

// Obten el valor de la variable
auto Sprite::getPosX() const -> int {
    return x_;
}

// Obten el valor de la variable
auto Sprite::getPosY() const -> int {
    return y_;
}

// Obten el valor de la variable
auto Sprite::getWidth() const -> int {
    return w_;
}

// Obten el valor de la variable
auto Sprite::getHeight() const -> int {
    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
auto Sprite::getSpriteClip() -> SDL_Rect {
    return sprite_clip_;
}

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

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

// Obten el valor de la variable
auto Sprite::getTexture() -> Texture * {
    return texture_;
}

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

// Obten el valor de la variable
auto Sprite::getRenderer() -> SDL_Renderer * {
    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
auto Sprite::isEnabled() -> bool {
    return enabled_;
}

// Devuelve el rectangulo donde está el sprite
auto Sprite::getRect() -> SDL_Rect {
    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;
}