/*
	Copyright 2016, 2017 Michele "King_DuckZ" Santullo

	This file is part of MyCurry.

	MyCurry is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	MyCurry is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with MyCurry.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include <memory>
#include <chrono>

namespace cloonel {
	class InputBag;
	class SDLMain;
} //namespace cloonel

namespace curry {
	class Texture;
	template <typename T> class Rect;

	class GameSceneBase {
	public:
		explicit GameSceneBase (cloonel::SDLMain* parSdlMain);
		virtual ~GameSceneBase() noexcept;

		void prepare();
		void destroy() noexcept;

		void exec();

		bool wants_to_quit() const;
		void set_wants_to_quit();

	protected:
		virtual void on_prepare() = 0;
		virtual void on_destroy() noexcept = 0;
		virtual void on_update (float parDeltaT) = 0;
		cloonel::SDLMain* sdl_main();
		cloonel::InputBag& input_bag();
		void draw_clipped (Texture& parTexture, Rect<float> parSrc, Rect<float> parDest);

	private:
		std::chrono::time_point<std::chrono::steady_clock> m_time0;
		std::unique_ptr<cloonel::InputBag> m_input;
		cloonel::SDLMain* m_sdlmain;
		float m_screen_width;
		float m_screen_height;
		bool m_wants_to_quit;
	};
} //namespace curry
