#pragma once
#include <map>
#include <iostream>

class Crawler;

namespace States{
	enum State{
		GAME_RUN,
		MAIN_MENU,
	};
};

class GameState{
public:
	inline static GameState*STATE=nullptr;
	inline static std::map<States::State,GameState*>states;
	static void Initialize();
	virtual void OnStateChange(GameState*prevState)=0;
	virtual void OnUserUpdate(Crawler*game)=0;
	virtual void Draw(Crawler*game)=0;
	static inline void ChangeState(States::State newState){
		GameState*prevState=STATE;
		if(!states.count(newState)){
			std::cout<<"WARNING! State not defined for state "<<newState<<"!"<<std::endl;
			throw;
		}
		STATE=states.at(newState);
		STATE->OnStateChange(prevState);
	}
};

class State_GameRun:public GameState{
	virtual void OnStateChange(GameState*prevState)override;
	virtual void OnUserUpdate(Crawler*game)override;
	virtual void Draw(Crawler*game)override;
};

class State_MainMenu:public GameState{
	virtual void OnStateChange(GameState*prevState)override;
	virtual void OnUserUpdate(Crawler*game)override;
	virtual void Draw(Crawler*game)override;
};