/***************************************************************/
//
//
//		DirectX	[select_input_device.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 08/15
/*---------------------------------------------------------------
■Update : 2016/08/15
			select_input_device.cppの作成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/

#include "main.h"

#include "select_input_device.h"
#include "input.h"
#include "gamepad.h"
#include "mouse.h"

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	型定義
---------------------------------------------------------------*/

// 関数ポインタの型名
typedef HRESULT (*pCreateDevice)( HINSTANCE hInstance, HWND hWnd );
typedef void (*MadeFunc)( void );

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/

HRESULT InitStandardDevice( HINSTANCE hInstance, HWND hWnd );
void UninitStandardDevice( void );
void UpdateStandardDevice( void );

/*---------------------------------------------------------------
	グローバル変数
---------------------------------------------------------------*/

// 初期化アドレス
pCreateDevice pInitDevice[] ={
	InitStandardDevice,
	InitGamepad,
};

// 終了アドレス
MadeFunc pUninitDevice[] ={
	UninitStandardDevice,
	UninitGamepad,
};

// 更新アドレス
MadeFunc pUpdateDevice[] ={
	UpdateStandardDevice,
	UpdateGamepad,
};


DEVICE_SELECTION device = DEVICE_GAMEPAD;			// 使用しているデバイス


// デバイスの初期化
void InitInputDevice( HWND hWnd, HINSTANCE hInstance )
{

	// ゲームパッドの初期化
	if( SUCCEEDED( pInitDevice[ DEVICE_GAMEPAD ]( hInstance, hWnd ) ) )
	{	
		//MessageBox( NULL, "ゲームパッドで起動します!" , " INFORMATION " , MB_OK );
		device = DEVICE_GAMEPAD;
		return;
	}

	// スタンダードデバイスの初期化
	if( SUCCEEDED( pInitDevice[ DEVICE_STANDARD ]( hInstance, hWnd ) ) )
	{	
		//MessageBox( NULL, "スタンダードデバイスで起動します!" , " INFORMATION " , MB_OK );
		device = DEVICE_STANDARD;
		return;
	}


}

// デバイスの終了処理
void UninitInputDevice( void )
{

	// 現在のデバイスの終了処理
	pUninitDevice[ device ]( );

}

// デバイスの更新
void UpdateInputDevice( void )
{

	// 現在のデバイスの更新処理
	pUpdateDevice[ device ]( );

}

// デバイスのセット
HRESULT SetInputDevice( DEVICE_SELECTION deviceNext )
{


	HWND hWnd;					// 仮想ハンドル
	HINSTANCE hInstance;		// 仮想インスタンス
	POINT point;				// 現在のハンドル内の座標であればよい


	// 現在のウィンドウ内のポジションであればどこでもよい
	point.x = SCREEN_WIDTH/2;
	point.y = SCREEN_HEIGHT/2;


	// ハンドルの取得		
	hWnd = WindowFromPoint( point );

	// インスタンスの取得
	hInstance =(HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE );

	// 更新後のデバイス初期化処理
	HRESULT hResult = pInitDevice[ deviceNext ]( hInstance, hWnd );

	if( FAILED( hResult ) ){

		MessageBox( NULL, " デバイスが見つかりません!!\nもう一度確認してやり直してください " , " DEVICE ERROR !! " , MB_OK | MB_ICONWARNING );
		return E_FAIL;
	}

	// 現在のデバイスの終了処理
	pUninitDevice[ device ]( );

	// デバイスのチェンジ
	device = deviceNext;

	return S_OK;

}

// 現在使用中のデバイスの取得
DEVICE_SELECTION GetCurrentDevice( void )
{

	return device;

}

// キーボード&マウスの初期化
HRESULT InitStandardDevice( HINSTANCE hInstance, HWND hWnd )
{

	HRESULT hResult;

	// 初期化処理
	hResult = InitKeyboard( hInstance, hWnd );

	if( FAILED( hResult ) )	{

		return E_FAIL;
	}

	hResult = InitMouse( hInstance, hWnd  );

	if( FAILED( hResult ) ){

		return E_FAIL;
	}

	return S_OK;

}

// キーボード&マウスの終了処理
void UninitStandardDevice( void )
{

	// 終了処理
	UninitKeyboard( );
	UninitMouse( );

}

// キーボード&マウスの更新処理
void UpdateStandardDevice( void )
{

	// 更新処理
	UpdateKeyboard( );
	UpdateMouse( );

}

