#pragma once

#include "utils/easing.hpp"

namespace Scenes {

    // Interpola una posició 2D entre dos punts durant un temps donat amb
    // una funció d'easing. No toca cap surface — el caller llegix x()/y()
    // i fa el blit ell mateix. Pensat per a scrolls, sprites que entren/
    // ixen per pantalla, i moviments d'objectes interpolats.
    class SpriteMover {
       public:
        using EaseFn = float (*)(float);

        SpriteMover() = default;

        // Arrenca un moviment nou. Si ja n'hi havia un en curs, es descarta.
        void moveTo(int x0, int y0, int x1, int y1, int duration_ms, EaseFn ease = Easing::linear);

        // Posicionament immediat (útil per a "teleportar" entre moviments).
        void setPosition(int x, int y);

        void tick(int delta_ms);

        [[nodiscard]] auto x() const -> int { return cur_x_; }
        [[nodiscard]] auto y() const -> int { return cur_y_; }
        [[nodiscard]] auto done() const -> bool { return elapsed_ms_ >= duration_ms_; }
        [[nodiscard]] auto progress() const -> float;  // 0..1 sense easing aplicat

       private:
        int x0_{0}, y0_{0}, x1_{0}, y1_{0};
        int duration_ms_{0};
        int elapsed_ms_{0};
        int cur_x_{0}, cur_y_{0};
        EaseFn ease_{Easing::linear};
    };

}  // namespace Scenes
