#pragma once

#include <SDL2/SDL.h>
#include "texture.h"

#ifndef SPRITE_H
#define SPRITE_H

// Clase sprite
class Sprite
{
protected:
    // Objetos y punteros
    SDL_Renderer *renderer; // Puntero al renderizador de la ventana
    Texture *texture;       // Textura donde estan todos los dibujos del sprite

    // Variables
    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_Rect spriteClip; // Rectangulo de origen de la textura que se dibujará en pantalla
    bool enabled;        // Indica si el sprite esta habilitado
    float zoomW;         // Cantidad de zoom en horizontal a aplicar al sprite
    float zoomH;         // Cantidad de zoom en verical a aplicar al sprite

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

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

    // Obten el valor de la variable
    int getPosX();

    // Obten el valor de la variable
    int getPosY();

    // Obten el valor de la variable
    int getWidth();

    // Obten el valor de la variable
    int getHeight();

    // Establece la posición del objeto
    void setPos(SDL_Rect rect);

    // Establece el valor de la variable
    void setPosX(int x);

    // Establece el valor de la variable
    void setPosY(int y);

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

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

    // Establece el valor de la variable
    void setWidth(int w);

    // Establece el valor de la variable
    void setHeight(int h);

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

    // Establece 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);

    // Obten el valor de la variable
    Texture *getTexture();

    // Establece el valor de la variable
    void setTexture(Texture *texture);

    // Establece el valor de la variable
    void setRenderer(SDL_Renderer *renderer);

    // Obten el valor de la variable
    SDL_Renderer *getRenderer();

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

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

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

    // Establece los valores de posición y tamaño del sprite
    void setRect(SDL_Rect rect);

    // Establece el nivel de zoom en horizontal
    void setZoomW(float value);

    // Establece el nivel de zoom en vertical
    void setZoomH(float value);
};

#endif
