#pragma once

#include <SDL3/SDL.h>

#include <string>  // for string
#include <vector>  // for vector

#include "utils/utils.h"  // for Circle
class AnimatedSprite;
class Texture;

// Clase Item
class Item {
   public:
    // Tipos de objetos
    enum class Id : Uint8 {
        NONE = 0,
        DISK = 1,
        GAVINA = 2,
        PACMAR = 3,
        CLOCK = 4,
        COFFEE = 5,
        COFFEE_MACHINE = 6,
    };

    Item(Id id, float x, float y, Texture *texture, std::vector<std::string> *animation, SDL_Renderer *renderer);  // Constructor
    ~Item();                                                                                                       // Destructor

    Item(const Item &) = delete;
    auto operator=(const Item &) -> Item & = delete;

    void allignTo(int x);     // Centra el objeto en la posición X
    void render();            // Pinta el objeto en la pantalla
    void disable();           // Pone a cero todos los valores del objeto
    void update();            // Actualiza al objeto a su posicion, animación y controla los contadores
    void updateTimeToLive();  // Actualiza el contador
    void checkTimeToLive();   // Comprueba si el objeto sigue vivo

    [[nodiscard]] auto getPosX() const -> float;   // Obtiene del valor de la variable
    [[nodiscard]] auto getPosY() const -> float;   // Obtiene del valor de la variable
    [[nodiscard]] auto getWidth() const -> int;    // Obtiene del valor de la variable
    [[nodiscard]] auto getHeight() const -> int;   // Obtiene del valor de la variable
    [[nodiscard]] auto getId() const -> Id;        // Obtiene del valor de la variable
    [[nodiscard]] auto isEnabled() const -> bool;  // Obtiene el valor de la variable
    [[nodiscard]] auto isOnFloor() const -> bool;  // Informa si el objeto ha colisionado con el suelo

    auto getCollider() -> Circle &;  // Obtiene el circulo de colisión

   private:
    // Objetos y punteros
    AnimatedSprite *sprite_;  // Sprite con los graficos del objeto

    // Variables
    float pos_x_;           // Posición X del objeto
    float pos_y_;           // Posición Y del objeto
    Uint8 width_;           // Ancho del objeto
    Uint8 height_;          // Alto del objeto
    float vel_x_;           // Velocidad en el eje X
    float vel_y_;           // Velocidad en el eje Y
    float accel_x_;         // Aceleración en el eje X
    float accel_y_;         // Aceleración en el eje Y
    bool floor_collision_;  // Indica si el objeto colisiona con el suelo
    Id id_;                 // Especifica el tipo de objeto que es
    bool enabled_;          // Especifica si el objeto está habilitado
    Uint16 time_to_live_;   // Temporizador con el tiempo que el objeto está presente
    Circle collider_;       // Circulo de colisión del objeto

    void shiftColliders();  // Alinea el circulo de colisión con la posición del objeto
    void move();            // Actualiza la posición y estados del objeto
};
