#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para shared_ptr

#include "core/rendering/sprite/sprite.hpp"  // Para SSprite
class Surface;                               // lines 8-8

// Clase SMovingSprite. Añade movimiento y flip al sprite
class MovingSprite : public Sprite {
   public:
    // Constructores
    MovingSprite(std::shared_ptr<Surface> surface, SDL_FRect pos, SDL_FlipMode flip);
    MovingSprite(std::shared_ptr<Surface> surface, SDL_FRect pos);
    explicit MovingSprite();
    explicit MovingSprite(std::shared_ptr<Surface> surface);
    ~MovingSprite() override = default;

    // Actualización y renderizado
    void update(float delta_time) override;                        // Actualiza variables internas (time-based)
    void render() override;                                        // Muestra el sprite por pantalla
    void render(Uint8 source_color, Uint8 target_color) override;  // Renderiza con reemplazo de color

    // Gestión de estado
    void clear() override;  // Reinicia todas las variables a cero

    // Getters de posición
    [[nodiscard]] auto getPosX() const -> float { return x_; }
    [[nodiscard]] auto getPosY() const -> float { return y_; }

    // Getters de velocidad
    [[nodiscard]] auto getVelX() const -> float { return vx_; }
    [[nodiscard]] auto getVelY() const -> float { return vy_; }

    // Getters de aceleración
    [[nodiscard]] auto getAccelX() const -> float { return ax_; }
    [[nodiscard]] auto getAccelY() const -> float { return ay_; }

    // Setters de posición
    void setPos(SDL_FRect rect);    // Establece posición y tamaño del objeto
    void setPos(float x, float y);  // Establece posición x, y
    void setPosX(float value);      // Establece posición X
    void setPosY(float value);      // Establece posición Y

    // Setters de velocidad
    void setVelX(float value) { vx_ = value; }
    void setVelY(float value) { vy_ = value; }

    // Setters de aceleración
    void setAccelX(float value) { ax_ = value; }
    void setAccelY(float value) { ay_ = value; }

    // Gestión de flip (volteo horizontal)
    void setFlip(SDL_FlipMode flip) { flip_ = flip; }                                              // Establece modo de flip
    auto getFlip() -> SDL_FlipMode { return flip_; }                                               // Obtiene modo de flip
    void flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; }  // Alterna flip horizontal

   protected:
    // Métodos protegidos
    void move(float delta_time);  // Mueve el sprite (time-based)

    // Variables miembro - Posición
    float x_{0.0F};  // Posición en el eje X
    float y_{0.0F};  // Posición en el eje Y

    // Variables miembro - Velocidad (pixels/segundo)
    float vx_{0.0F};  // Velocidad en el eje X
    float vy_{0.0F};  // Velocidad en el eje Y

    // Variables miembro - Aceleración (pixels/segundo²)
    float ax_{0.0F};  // Aceleración en el eje X
    float ay_{0.0F};  // Aceleración en el eje Y

    // Variables miembro - Renderizado
    SDL_FlipMode flip_{SDL_FLIP_NONE};  // Modo de volteo del sprite
};