#pragma once
#include "IScene.h"
#include "Timer.h"
#include "Input.h"
#include "Camera.h"

namespace DXFW
{
class Director
{
private:
	std::list< std::shared_ptr<IScene> > scenes;

	Director(){};
	/// <summary>説明</summary>
	static Director& Single()
	{
    	static Director instance; 
    	return instance;
	}

public:
	/// <summary>説明</summary>
	static void Run()
	{
		Time::ResetFPS();

		while( Dx::ProcessMessage() )
		{
			if( Single().scenes.size() == 0 ) break;
			Single().scenes.back()->Update();
			Remove();			
			Single().scenes.back()->Draw();

			//更新処理
			if( Camera::Now() ) Camera::Now()->Update();
			Input::Update();
			Time::CheckFPS();
			Screen::Flip();
			Screen::Clear();
		}
	}

	/// <summary>説明</summary>
	static void Remove()
	{
		auto it = Single().scenes.begin();

		while( it != Single().scenes.end() )
		{
			if( (*it)->IsEnd() )
			{
				Single().scenes.remove( (*it) );
				continue;
			}
			it++;
		}
	}

	/// <summary>説明</summary>
	static void SetActive( IScene* scene )
	{
		//既に存在する場合追加のみ
		auto it = Single().scenes.begin();
		while( it != Single().scenes.end() )
		{
			if( (*it).get() == scene  )
			{
				Single().scenes.push_back( std::shared_ptr<IScene>(scene) );
				Single().scenes.remove( (*it) );
				return;
			}
			break;
		}
		//存在していない場合初期化もする
		scene->Init();
		Single().scenes.push_back( std::shared_ptr<IScene>(scene) );
	}
};
}