#pragma once

//! @file Mix/IEngine.h
//! @brief エンジンインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{

	//! @class IEngine
	//! @brief エンジンインターフェース
	class IEngine : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IEngine( void ){}

	public:
		//! @brief 毎秒のフレーム数をリセットします
		virtual void ResetFPS( void ) = 0;
		//! @brief 毎秒のフレーム数を取得します
		//! @return 毎秒のフレーム数を返します
		virtual Float32 GetFPS( void ) const = 0;
		//! @brief 基準となる毎秒のフレーム数を取得します
		//! @return 基準となる毎秒のフレーム数を返します
		virtual Int32 GetBaseFPS( void ) const = 0;

		//! @brief 毎秒の 1 フレームの所要時間 ( 秒単位 ) を取得します
		//! @return 毎秒の 1 フレームの所要時間を返します
		virtual Float32 GetDT( void ) const = 0;
		//! @brief 基準となる 1 フレームの所要時間 ( 秒単位 ) を取得します
		//! @return 基準となる 1 フレームの所要時間を返します
		virtual Float32 GetBaseDT( void ) const = 0;

		//! @brief 毎秒のスリープ時間を取得します
		//! @return スリープ時間を返します
		virtual Float32 GetSleepTimePerSec( void ) const = 0;

		//! @brief 毎秒のスリープ状態に入れなかった回数を取得します
		//! @return スリープ状態に入れなかった回数を返します
		virtual Int32 GetInsomniaFrameCountPerSec( void ) const = 0;
		//! @brief スリープ状態に入れなかった場合に他のスレッドにタイムスライスを譲る( Sleep( 0 ) )フレーム数
		//! @return フレーム数を返します
		virtual Int32 GetInsomniaFrameMax( void ) const = 0;

		//! @brief ウィンドウのハンドルを取得します
		//! @return ウィンドウのハンドルを返します
		virtual HWND GetWindowHandle( void ) const = 0;
		//! @brief クライアントのサイズを取得します
		//! @return クライアントのサイズを表す Mix::Point クラスを返します。
		virtual Mix::Point GetClientSize( void ) const = 0;

		//! @brief アクティブかどうかを確認します
		//! @return アクティブな場合は True を返します
		virtual Boolean IsActive( void ) const = 0;

		//! @brief タイトルバーに表示するキャプションを取得します
		//! @return キャプションを返します
		virtual const wchar_t* GetCaption( void ) const = 0;
		//! @brief タイトルバーに表示するキャプションを設定します
		//! @param[in] pCaption キャプション
		virtual void SetCaption( const wchar_t* pCaption ) = 0;

		//! @brief ウィンドウを閉じる動作を取得します
		//! @return ウィンドウの閉じるボタンが有効な場合は True を返します
		virtual Boolean IsCloseEnabled( void ) const = 0;
		//! @brief ウィンドウの閉じる動作を設定します
		//! @param[in] state ウィンドウの閉じる動作を有効にする場合は True
		virtual void SetCloseEnabled( Boolean state ) = 0;

		//! @brief メッセージプロシージャーを設定します
		//! @param[in] pMsgProc メッセージを処理する関数のポインタ
		//! @param[in] pData メッセージを処理する関数に渡されるデータのポインタ
		virtual void SetMessageProc( Mix::MessageProcPtr pMsgProc, void* pData = NULL ) = 0;

		//! @brief エンジンを更新します
		//! @return 更新を継続する必要がある場合は True を返します
		virtual Boolean Update( void ) = 0;

		//! @brief ウィンドウを閉じ、エンジンを停止します
		//! @note ウィンドウを閉じる動作を無効にしている場合は、機能しません。
		virtual void Shutdown( void ) = 0;
	};

}
