#ifndef TIMELINE_H
#define TIMELINE_H

#include <SFML/Config.hpp>
#include <SFML/Graphics/RectangleShape.hpp>

#include <vector>
#include <memory>

using microsec = sf::Int64;
class Note;
class TimelineViewManager;

class Timeline : public sf::Drawable // Probably it's bad
{
public:
    explicit Timeline(std::unique_ptr<TimelineViewManager> view_manager);
    virtual ~Timeline();

    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;

    void update(const microsec& music_offset);
    Note *fetchActiveNote(const microsec &music_offset) noexcept;

 /* void init();  */
    void clear();

private:
    std::vector<Note*> _timeline;
    std::vector<Note*>::const_iterator _top_note;
    Note* _active_note;

    std::vector<Note*>::const_iterator _last_visible_note;
    microsec _visibility_offset;

    std::unique_ptr<TimelineViewManager> _view_manager;

    void checkCurrentActiveNote(const microsec &music_offset);
    void checkForNextActiveNote(const microsec &music_offset);
    void prepareNotesToDraw(const microsec &music_offset);

    /* Difference between top and active note is that
     * top note is the note handling input right now
     * OR it's the closest note from current music offset
     * position, not necessarily active. A note stops being top only
     * after dying or being tapped by player, even if it's already
     * past her perfect offset.
     *
     * Meanwhile active note is the note which is currently handling
     *     player input for grade.
     *
     * An active note is always top note but a top note
     *    is not always active note.
     *                                         */
};

#endif // TIMELINE_H