/**
 * \defgroup Components
 * \desc Constants for Components
 * @{
 */
const string	COMP_NAME_NONE				= "None";
const int		COMP_TYPE_UNDEFINED			= -1;
const int		COMP_TYPE_ETITY_DEBUG		= 0;
const int		COMP_TYPE_ENERGY_MANAGER	= 1;
const int		COMP_TYPE_BODY_STAGING		= 2;
const int		COMP_TYPE_ANIMAL_BLEEDING	= 3;
const int		COMP_TYPE_COUNT				= 4;
/** @}*/

class Component
{

	//==========================================
	// Variables Private Static
	private static string m_CompNames[COMP_TYPE_COUNT];	
	
	//==========================================
	// Variables Private
	protected EntityAI		m_ThisEntityAI;
	
	//==========================================
	
	void 	Event_OnFrame(IEntity other, float timeSlice);
	Shape 	DebugBBoxDraw();
	void	DebugBBoxSetColor(int color);
	void	DebugBBoxDelete();
	Shape	DebugDirectionDraw(float distance = 1);
	void	DebugDirectionSetColor(int color);
	void	DebugDirectionDelete();
	
	// Methods Public Static
	static void	Init()
	{
		m_CompNames[COMP_TYPE_ETITY_DEBUG]			= "ComponentEntityDebug";
		m_CompNames[COMP_TYPE_ENERGY_MANAGER]		= "ComponentEnergyManager";
		m_CompNames[COMP_TYPE_BODY_STAGING]			= "ComponentBodyStaging";
		m_CompNames[COMP_TYPE_ANIMAL_BLEEDING]		= "ComponentAnimalBleeding";
	}

	///////////////////////////////////public/static
	// GetNameByType
	////////////////////////////////////////////////
	static string GetNameByType(int comp_type)
	{
		if ( IsTypeExist(comp_type) == false )
		{
			LogErrorBadCompType(comp_type, "Component->GetNameByType()");
			return "None";
		}
		
		return m_CompNames[comp_type];
	}

	///////////////////////////////////public/static
	// IsTypeExist
	////////////////////////////////////////////////
	static bool IsTypeExist(int comp_type)
	{
		if ( comp_type < 0 || comp_type >= COMP_TYPE_COUNT )
		{
			return false;
		}
		
		return true;
	}


	///////////////////////////////////public/static
	// LogErrorBadCompType
	////////////////////////////////////////////////
	static void	LogErrorBadCompType(int comp_type, string fnc_name)
	{
		string msg = "Bad parameter comp_type='"+comp_type.ToString()+"'. Parameter must be 0-"+(COMP_TYPE_COUNT - 1).ToString()+". Returning component name 'None'.";
		Debug.LogError(msg, "Component", "n/a", fnc_name);
	}

	///////////////////////////////////public/static
	// LogWarningAlredyExist
	////////////////////////////////////////////////
	static void	LogWarningAlredyExist(int comp_type, string fnc_name)
	{
		string msg = "Component '"+Component.GetNameByType(comp_type)+"' already exists!";
		Debug.LogError(msg, "Component", "n/a", fnc_name);
	}

	//=======================================public
	// SetParentEntityAI
	//=============================================
	void SetParentEntityAI(EntityAI e)
	{
		m_ThisEntityAI = e;
	}

	//====================================protected
	// Awake
	//=============================================
	void Event_OnAwake()
	{
		
	}

	//====================================protected
	// Init
	//=============================================
	void Event_OnInit()
	{
		
	}

	//=======================================public
	// Log
	//=============================================
	void LogThis(string msg, string fnc_name = "n/a")
	{
		//Debug.Log(msg, GetCompName(), "n/a", fnc_name, m_ThisEntityAI.ToString());
	}

	//=======================================public
	// LogWarning
	//=============================================
	void LogThisWarning(string msg, string fnc_name = "n/a")
	{
		Debug.LogWarning(msg, GetCompName(), "n/a", fnc_name, m_ThisEntityAI.ToString());
	}

	//=======================================public
	// LogError
	//=============================================
	void LogThisError(string msg, string fnc_name = "n/a")
	{
		Debug.LogError(msg, GetCompName(), "n/a", fnc_name, m_ThisEntityAI.ToString());
	}

	//=======================================public
	// GetType
	//=============================================
	string GetCompName()
	{
		return Component.GetNameByType(this.GetCompType());
	}

	//=======================================public
	// GetType
	//=============================================
	int GetCompType()
	{
		return COMP_TYPE_UNDEFINED;
	}

	//=======================================public
	// Event_OnItemAttached
	//=============================================
	void Event_OnItemAttached(EntityAI item, string slot_name)
	{
		LogThis("" + item + " -> " + slot_name,"Event_OnItemAttached");
		//Debug.Log("Component=>Event_OnItemAttached: " + item + " -> " + slot_name, );
	}

	//=======================================public
	// Event_OnItemDetached
	//=============================================
	void Event_OnItemDetached(EntityAI item, string slot_name)
	{
		LogThis("" + item + " <- " + slot_name,"Event_OnItemDetached");
		//Log("Component=>Event_OnItemDetached: " + item + " <- " + slot_name );
	}
}