#pragma once

//! @file Mix/HID/IGamepad.h
//! @brief ゲームパッドインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace HID{

	//! @class IGamepad
	//! @brief ゲームパッドインターフェース
	class IGamepad : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IGamepad( void ){}

	public:
		//! @brief ボタンの状態を取得します
		//! @param[in] index ボタンを表す Mix::HID::GAMEPAD_BUTTON 列挙定数
		//! @return ボタンの状態を表す Mix::HID::SWITCH_STATE 列挙定数の組み合わせを返します
		virtual UInt32 GetButtonState( UInt32 index ) const = 0;
		//! @brief トリガーの状態を取得します
		//! @param[in] index トリガーのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @return トリガーの状態を( 0.0f〜1.0f )を返します
		virtual Float32 GetTriggerState( UInt32 index ) const = 0;
		//! @brief スティックの状態を取得します
		//! @param[in] index スティックのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @return スティックの状態を表す Mix::Vector2 クラスを返します
		virtual const Mix::Vector2& GetStickState( UInt32 index ) const = 0;

		//! @brief このインターフェースが利用可能などうかを確認します
		//! @return このインターフェースが利用可能な場合は True を返します
		virtual Boolean IsAvailable( void ) const = 0;

		//! @brief このインターフェースで使用しているAPIを取得します
		//! @return 使用しているAPIを表す Mix::HID::GAMEPAD_API 列挙定数を返します
		virtual Mix::HID::GAMEPAD_API GetAPI( void ) const = 0;

		//! @brief 割り当てるソースのボタンの値を取得します( DirectInput )
		//! @param[in] index ボタンのインデックス( 0〜31 )
		//! @return ボタンの値を返します。
		//! @note
		//! 0 以上でボタンが押されていることになります。<br>
		//! ボタンの割り当て ( SetButtonAssignment ) の際のヘルパーとしてお使いください。
		virtual UInt8 GetSourceButtonValue( UInt32 index ) const = 0;
		//! @brief 割り当てるソースの POV の値を取得します( DirectInput )
		//! @param[in] index POV のインデックス( 0〜7 )
		//! @return POV の値を返します。
		//! @note
		//! 0 以上で POV が押されていることになります。<br>
		//! ボタンの割り当て ( SetButtonAssignment ) の際のヘルパーとしてお使いください。
		virtual UInt32 GetSourcePovValue( UInt32 index ) const = 0;

		//! @brief ボタンの割り当てを設定します( DirectInput )
		//! @param[in] targetIndex ボタンの割り当て先ボタンを表す Mix::HID::GAMEPAD_BUTTON 列挙定数
		//! @param[in] sourceIndex ボタンの割り当て元ボタン( 0〜31 )、もしくわ POV( 0〜7 )
		virtual void SetButtonAssignment( UInt32 targetIndex, UInt32 sourceIndex ) = 0;
		//! @brief ボタンの割り当て元を取得します( DirectInput )
		//! @param[in] targetIndex ボタンの割り当て先を表す Mix::HID::GAMEPAD_BUTTON 列挙定数
		//! @return ボタンの割り当て元を返します
		//! @note ボタンの割り当てが無効( XInput )、もしくわ targetIndex が範囲を超えている場合は 0xFFFFFFFF を返します
		virtual UInt32 GetButtonAssignment( UInt32 targetIndex ) const = 0; 

		//! @brief トリガーの割り当てを設定します( DirectInput )
		//! @param[in] targetIndex トリガーの割り当て先( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @param[in] sourceIndex トリガーの割り当て元ボタン( 0〜31 )
		virtual void SetTriggerAssignment( UInt32 targetIndex, UInt32 sourceIndex ) = 0; 
		//! @brief トリガーの割り当て元ボタンを取得します( DirectInput )
		//! @param[in] targetIndex トリガーの割り当て先( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @return トリガーの割り当て元ボタンを返します
		//! @note トリガーの割り当てが無効( XInput )、もしくわ targetIndex が範囲を超えている場合は 0xFFFFFFFF を返します
		virtual UInt32 GetTriggerAssignment( UInt32 targetIndex ) const = 0; 

		//! @brief トリガーの閾値を設定します( XInput )
		//! @param[in] index トリガーのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @param[in] threshold トリガーの閾値( 0〜255 )
		virtual void SetTriggerThreshold( UInt32 index, UInt8 threshold ) = 0;
		//! @brief トリガーの閾値を取得します( XInput )
		//! @param[in] index トリガーのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @return トリガーの閾値を返します
		//! @note トリガーの閾値が無効( DirectInput )の場合は Mix::HID::GAMEPAD_TRIGGER_RESOLUTION を返します
		virtual UInt8 GetTriggerThreshold( UInt32 index ) const = 0;

		//! @brief スティックのデッドゾーンを設定します
		//! @param[in] index スティックのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @param[in] deadZone デッドゾーン( 0〜32767 )
		virtual void SetStickDeadZone( UInt32 index, Int16 deadZone ) = 0;
		//! @brief スティックのデッドゾーンを取得します
		//! @param[in] index スティックのインデックス( Mix::HID::GAMEPAD_LEFT もしくわ Mix::HID::GAMEPAD_RIGHT )
		//! @return スティックのデッドゾーンを返します
		//! @note index が範囲を超えている場合は Mix::HID::GAMEPAD_STICK_RESOLUTION を返します
		virtual Int16 GetStickDeadZone( UInt32 index ) const = 0;
	};

}}
