#pragma once

#include <SDL3/SDL.h>

#include <memory>      // Para shared_ptr
#include <string>      // Para string
class AnimatedSprite;  // lines 7-7

class Enemy {
   public:
    struct Data {
        std::string animation_path;  // Ruta al fichero con la animación
        float x{0.0F};               // Posición inicial en el eje X
        float y{0.0F};               // Posición inicial en el eje Y
        float vx{0.0F};              // Velocidad en el eje X
        float vy{0.0F};              // Velocidad en el eje Y
        int x1{0};                   // Límite izquierdo de la ruta en el eje X
        int x2{0};                   // Límite derecho de la ruta en el eje X
        int y1{0};                   // Límite superior de la ruta en el eje Y
        int y2{0};                   // Límite inferior de la ruta en el eje Y
        bool flip{false};            // Indica si el enemigo hace flip al terminar su ruta
        bool mirror{false};          // Indica si el enemigo está volteado verticalmente
        int frame{0};                // Frame inicial para la animación del enemigo
        std::string color;           // Color del enemigo
    };

    explicit Enemy(const Data& enemy);  // Constructor
    ~Enemy() = default;                 // Destructor

    void render();                  // Pinta el enemigo en pantalla
    void update(float delta_time);  // Actualiza las variables del objeto
#ifdef _DEBUG
    void updateAnimation(float delta_time);         // Solo actualiza la animación sin mover al enemigo
    void resetToInitialPosition(const Data& data);  // Resetea el enemigo a su posición inicial (para editor)
#endif

    auto getRect() -> SDL_FRect;       // Devuelve el rectangulo que contiene al enemigo
    auto getCollider() -> SDL_FRect&;  // Obtiene el rectangulo de colision del enemigo

   private:
    void checkPath();  // Comprueba si ha llegado al limite del recorrido para darse media vuelta

    std::shared_ptr<AnimatedSprite> sprite_;  // Sprite del enemigo

    // Variables
    Uint8 color_{0};             // Color del enemigo
    std::string color_string_;   // Color del enemigo en formato texto
    int x1_{0};                  // Limite izquierdo de la ruta en el eje X
    int x2_{0};                  // Limite derecho de la ruta en el eje X
    int y1_{0};                  // Limite superior de la ruta en el eje Y
    int y2_{0};                  // Limite inferior de la ruta en el eje Y
    SDL_FRect collider_{};       // Caja de colisión
    bool should_flip_{false};    // Indica si el enemigo hace flip al terminar su ruta
    bool should_mirror_{false};  // Indica si el enemigo se dibuja volteado verticalmente
};
