// Cross-platform rendering and input interface.

#ifndef PLATFORM_HPP
#define PLATFORM_HPP

#include <chrono>
#include <functional>
#include <unordered_set>
#include "PixelBuffer.hpp"

using FloatSeconds = std::chrono::duration<float>;

class Platform {
protected:
	FloatSeconds frame_time_prev = FloatSeconds(0.0f);

public:
	static constexpr FloatSeconds FRAME_TIME_TARGET = FloatSeconds(1.0f / 60.0f);

	// Runs [func], then sleeps until one frame has elapsed. The default
	// implementation uses C++ standard library facilities.
	virtual void frame(std::function<void(FloatSeconds const &)> func);

	// Returns any keys currently pressed.
	virtual std::unordered_set<char> get_input(void) = 0;

	virtual void render(PixelBuffer const &buffer) = 0;
	virtual void set_title(std::string const &title);

	// More reliable than destructors.
	virtual void exit();
};

#endif // PLATFORM_HPP