#pragma once

namespace Scenes {

    // Cicla per un conjunt de frames numerats (0..num_frames-1) avançant un
    // frame cada `frame_ms` mil·lisegons. No carrega ni dibuixa cap sprite —
    // només el caller sap quins frames dibuixar a partir de `frame()`.
    //
    // Usat per animacions periòdiques amb frames subsamplejats: palmeres,
    // camell, aigua, torxes, Sam caminant amb `(i/5) % fr` del codi original.
    class FrameAnimator {
       public:
        FrameAnimator() = default;
        FrameAnimator(int num_frames, int frame_ms, bool loop = true);

        void tick(int delta_ms);

        [[nodiscard]] auto frame() const -> int { return current_frame_; }
        [[nodiscard]] auto done() const -> bool { return !loop_ && finished_; }
        [[nodiscard]] auto numFrames() const -> int { return num_frames_; }

        void reset();
        void setFrameMs(int frame_ms) { frame_ms_ = frame_ms; }

       private:
        int num_frames_{1};
        int frame_ms_{100};
        bool loop_{true};
        int current_frame_{0};
        int elapsed_ms_{0};
        bool finished_{false};
    };

}  // namespace Scenes
