#pragma once

#include <map>
#include <memory>

#include "core/game.h"
#include "core/timeline.h"
#include "classicmode/classicnote.h"
#include "classicmode/classicactions.h"

class ClassicGraphicsManager;
class HoldManager;

class ClassicGame final : public kku::Game
{
public:
    explicit ClassicGame(const std::shared_ptr<kku::Timeline<ClassicNote>>& timeline,
                         const std::shared_ptr<ClassicGraphicsManager>& graphics_manager);
    virtual ~ClassicGame() override;

    virtual void run() override;

    virtual void input(kku::GameEvent&& inputdata) override;
    virtual void update(kku::UpdateData&& updatedata) override;
    virtual void display() const override;

private:
    const std::shared_ptr<kku::Timeline<ClassicNote>> _timeline;
    const std::shared_ptr<ClassicGraphicsManager> _graphics_manager;
    const std::shared_ptr<HoldManager> _hold_manager;
};
