#pragma once

#include <memory>
union SDL_Event;

enum ModeSecondClick { Unset, Reset, NoAction };
template<typename Target, ModeSecondClick msc = ModeSecondClick::Unset> class Mode {
public:
	explicit Mode(Target & t) : target {t} { }

	Target & target;

	template<typename Mode, typename... Params>
	auto
	toggle(Params &&... params)
	{
		return [params..., this](const SDL_Event &) {
			toggleSetMode<Mode>(std::forward<Params>(params)...);
		};
	}

private:
	template<typename Mode, typename... Params>
	void
	toggleSetMode(Params &&... params)
	{
		if (dynamic_cast<Mode *>(target.get())) {
			if constexpr (msc == ModeSecondClick::Unset) {
				target.reset();
			}
			if constexpr (msc == ModeSecondClick::Reset) {
				target = std::make_unique<Mode>(std::forward<Params>(params)...);
			}
		}
		else {
			target = std::make_unique<Mode>(std::forward<Params>(params)...);
		}
	}
};