#pragma once

#include <SDL3/SDL.h>

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

// Estructura para pasar los datos de un enemigo
struct EnemyData {
        std::string surface_path;    // Ruta al fichero con la textura
        std::string animation_path;  // Ruta al fichero con la animación
        int w;                       // Anchura del enemigo
        int h;                       // Altura del enemigo
        float x;                     // Posición inicial en el eje X
        float y;                     // Posición inicial en el eje Y
        float vx;                    // Velocidad en el eje X
        float vy;                    // Velocidad en el eje Y
        int x1;                      // Limite izquierdo de la ruta en el eje X
        int x2;                      // Limite derecho de la ruta en el eje X
        int y1;                      // Limite superior de la ruta en el eje Y
        int y2;                      // Limite inferior de la ruta en el eje Y
        bool flip;                   // Indica si el enemigo hace flip al terminar su ruta
        bool mirror;                 // Indica si el enemigo está volteado verticalmente
        int frame;                   // Frame inicial para la animación del enemigo
        std::string color;           // Color del enemigo
};

class Enemy {
    private:
        // Objetos y punteros
        std::shared_ptr<SurfaceAnimatedSprite> sprite_;  // Sprite del enemigo

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

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

    public:
        // Constructor
        explicit Enemy(const EnemyData& enemy);

        // Destructor
        ~Enemy() = default;

        // Pinta el enemigo en pantalla
        void render();

        // Actualiza las variables del objeto
        void update();

        // Devuelve el rectangulo que contiene al enemigo
        auto getRect() -> SDL_FRect;

        // Obtiene el rectangulo de colision del enemigo
        auto getCollider() -> SDL_FRect&;
};
