
/** @file */


// constants for device (binding device) type determine:
//
//	EUAINPUT_DEVICE_KEYBOARD
//	EUAINPUT_DEVICE_MOUSE
//	EUAINPUT_DEVICE_KEYBOARDMOUSE
//	EUAINPUT_DEVICE_CONTROLLER
//	EUAINPUT_DEVICE_IR

// -------------------------------------------------------------------------
class UAIDWrapper
{
	private void UAIDWrapper() {}
	private void ~UAIDWrapper() {}
	
	proto native UAInput InputP();			// get input pointer
};

// -------------------------------------------------------------------------
class UAInput
{
	proto native int ID();			// return input index
	proto native int NameHash();	// return input hash

	proto native int BindingCount();	// return binding count
	proto native int Binding( int iIndex );	// return binding at index

	proto native void ClearBinding();	// remove all bindings

	proto native void BindCombo( string sButtonName );		// bind combo to this input by name (single/ or append to existing button)
	proto native void BindComboByHash( int iHash );			// bind combo to this input by hash (single/ or append to existing button)

	proto native void AddAlternative();						// add new alternative keybind
	proto native void ClearAlternative( int iIndex );		// clear binding alternative by index
	proto native void SelectAlternative( int iIndex );		// select binding alternative by index
	proto native int AlternativeCount();					// get currently assigned alternative count
	proto native int AlternativeIndex();					// get currently selected alternative index
	proto native void ClearDeviceBind( int iDeviceFlags );	// clear binding for specific device(s)

	proto native int BindKeyCount(); // binded key count (for selected alternative)
	proto native int GetBindKey( int iIndex ); // binded "control" at index (for selected alternative)
	proto native int GetBindDevice( int iIndex ); // binded "control" device type at index (for selected alternative)
	proto native bool CheckBindDevice( int iIndex, int iDeviceFlags ); // compare binded device "control" type :: EUAINPUT_DEVICE_KEYBOARD for example

	proto native float LocalValue();

	proto native bool LocalPress();
	proto native bool LocalRelease();
	proto native bool LocalHold();
	proto native bool LocalHoldBegin();
	proto native bool LocalDoubleClick();
	proto native bool LocalClick();

	proto native bool IsCombo();	// return true if there is currently combo bind - use Binding() result !!!

	// normal state is there are no limits, input generates all the events
	// but if there is an limiter, 
	proto native bool IsLimited();	// return true if there is an event limit

	proto native bool IsLimitConditionActive();	// return true if event limits matches current control item activity

	proto native bool IsPressLimit();		// if limited to PRESS
	proto native bool IsReleaseLimit();		// if limited to RELEASE
	proto native bool IsHoldLimit();		// if limited to HOLD
	proto native bool IsHoldBeginLimit();	// if limited to HOLDBEGIN
	proto native bool IsClickLimit();		// if limited to SINGLE CLICK
	proto native bool IsDoubleClickLimit();	// if limited to DOUBLE CLICK

	proto native bool HasSorting( int iIndex );		// has sorting group index?

	proto native void Supress();			// supress press event for next frame (while not pressed ATM - otherwise until release)

	// take care when using these locking methods, if two or more systems un/lock the same input, there is a chance off cross-un/locking it from a wrong place! Use exclude groups instead.
	proto native bool IsLocked();			// determine if locked (not active ATM)
	proto native void Lock();				// lock (until unlock called or exclusion is selected)
	proto native void Unlock();				// unlock exclusively

	proto native int ConflictCount();		// get number of conflicts with other inputs

	proto native void ForceEnable( bool bEnable );	// force enable on/ off
	proto native void ForceDisable( bool bEnable );	// force disable on/ off

	proto native void Backlit_Override( int eType, int iColor ); // enable/ disable backlit of associated controls (EUABACKLIT_*)
	proto native bool Backlit_Enabled(); // check whether associated controls are backlit

	proto native UAIDWrapper GetPersistentWrapper(); // create persistent object for input access

	private void UAInput();
	private void ~UAInput();
};

// -------------------------------------------------------------------------
class UAInterface
{
	private void UAInterface() {}
	private void ~UAInterface() {}
	
	// getting action state
	/**
	\brief Get action state
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return actual action state as float, for regular two state buttons returns 0 or 1, for analog buttons/axes returns value in interval <0, 1> with consideration of defined deadzones
	@see SyncedValue()
	*/
	proto native float	SyncedValue_ID(int action, bool check_focus = true);
	proto native float	SyncedValue(string action, bool check_focus = true);
		
	/**  
	\brief Returns true just in frame, when action was invoked (button was pressed)
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return true if action was invoked in that frame, false otherwise
	@see SyncedPress()
	*/
	proto native bool	SyncedPress_ID(int action, bool check_focus = true);
	proto native bool	SyncedPress(string action, bool check_focus = true);
	
	/**  
	\brief Returns true just in frame, when release action happened (button was released)
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return true if action was released in that frame, false otherwise
	@see SyncedRelease()
	*/
	proto native bool	SyncedRelease_ID(int action, bool check_focus = true);
	proto native bool	SyncedRelease(string action, bool check_focus = true);

	/**  
	\brief Returns true just in frame, when hold action invoked (button is hold)
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return true if action was released in that frame, false otherwise
	@see SyncedHold()
	*/
	proto native bool	SyncedHold_ID(int action, bool check_focus = true);
	proto native bool	SyncedHold(string action, bool check_focus = true);

	/**  
	\brief Returns true just in frame, when double click action invoked (button double clicked)
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return true if action was released in that frame, false otherwise
	@see SyncedDbl()
	*/
	proto native bool	SyncedDbl_ID(int action, bool check_focus = true);
	proto native bool	SyncedDbl(string action, bool check_focus = true);
	
	/**  
	\brief Returns true just in frame, when single click action invoked (button pressed and released before hold timer)
	@param action id of action, defined in \ref 4_World/Classes/UserActionsComponent/_constants.c
	@param check_focus if true and game is unfocused, returns 0; otherwise returns actual value
	@return true if action was released in that frame, false otherwise
	@see SyncedClick()
	*/
	proto native bool	SyncedClick_ID(int action, bool check_focus = true);
	proto native bool	SyncedClick(string action, bool check_focus = true);
	
};

// -------------------------------------------------------------------------
class UAInputAPI
{
	private void UAInputAPI() {}
	private void ~UAInputAPI() {}
	
	proto native void ListCurrentProfile();
	proto native void ListCurrentPreset();
	proto native void ListAvailableButtons();
	proto native void ListActiveGroup();

	proto native void GetActiveInputs( out TIntArray items ); //! returns list of all bindable (i.e. visible) inputs from the active group ('core' by default)

	proto native UAInput GetInputByID( int iID );
	proto native UAInput GetInputByName( string sInputName );

	proto native owned string GetButtonName( int iHash );	// get localized name for any button hash
	proto native owned string GetButtonIcon( int iHash );	// get associated icon path for any button hash

	proto native int ModificatorCount();	// modificator count
	proto native owned string GetModificatorName( int index );	// modificator name
	
	// for options only mapping, do not call normally as it is not performance wise!
	proto native int DeterminePressedButton();	// recently pressed key, mouse button or pad button (returns zero if nothing pressed)
	proto native int DeterminedCount(); // all buttons (keys, etc.) pressed during determination test (call only when DeterminePressedButton() returned something !)
	proto native int GetDetermined( int iIndex ); // total count of pressed buttons (call only when DeterminePressedButton() returned something !)

	proto native UAInput RegisterInput( string sInputName, string sLoc, string sGroupName );
	proto native void DeRegisterInput( string sInputName );

	proto native void RegisterGroup( string sGroupName, string sLoc );
	proto native void DeRegisterGroup( string sGroupName );

	proto native void UpdateControls(); // call this on each change of exclusion
	proto native void ActivateGroup( string sGroupName );
	proto native void ActivateExclude( string sExcludeName );
	proto native void ActivateContext( string sContextName );
	proto native void ActivateModificator( string sModName );
	proto native void DeactivateModificator( string sModName );

	proto native void DeactivateContext();

	proto native bool PresetCreateNew(); // create new dynamic preset from the selected one. False == cannot create new == too many presets (current max == 6)
	proto native bool PresetDelete( int index ); // delete specific preset - (false == not deletable!)
	proto native int PresetCurrent(); // determine index of current preset - (-1 == not selected)
	proto native void PresetSelect( int index ); // select specific preset
	/**  
	\brief Resets current 'main' preset without reverting anything else ('softer' Revert)
	\note Does not reset dynamic presets, since they don't have any real defaults in the core PBOs.
	*/
	proto native void PresetReset();
	proto native int PresetCount(); // count of presets
	proto native owned string PresetName( int index ); // name of selected preset

	proto native int SortingCount(); // sorting group count
	proto native owned string SortingName( int index );	// sorting group name (different from localization!)
	proto native owned string SortingLocalization( int index );	// sorting group localized name

	proto native void Export(); // export XML (user) configuration
	proto native void Revert(); // revert XML (user) configuration - all of it and use default PBO content! Auto-exports afterward.
	proto native void SaveInputPresetMiscData(); // saves preset index on consoles, where the regular XMLs are unavailable
	proto native void SupressNextFrame( bool bForce); // supress inputs for nextframe (until key release - call this when leaving main menu and alike - to avoid button collision after character control returned)
	
	proto native void Backlit_None(); // turn off backlit
	proto native void Backlit_Background( int eType, int iColor1, int iColor2 ); // start backlit
	proto native void Backlit_Animation( string strName, float fLifeTime, int iColor1, int iColor2 ); // start backlit animation and after time limit -> continue with another one
	proto native bool Backlit_Enabled(); // check whether backlit active
	proto native void Backlit_KeyByHash( int uHash, int eLayer, int eType, int iColor ); // key directly (during keybinding process) (EUABACKLIT_*)
	proto native void Backlit_KeyByName( string strName, int eLayer, int eType, int iColor ); // key directly (by name) (EUABACKLIT_*)
	proto native void Backlit_Remove( int eLayer ); // turn off layer of backlit
	proto native void Backlit_ForceUpdate(); // this forces update immediately - USE ONLY IN LOADING SEQUENCE !!!
	proto native void Backlit_EmptyQueue(); // empty queue of animations - use if you want to play something immediately

};

proto native UAInputAPI GetUApi();
