namespace KBEngine
{
  	using UnityEngine; 
	using System; 
	using System.Collections; 
	using System.Collections.Generic;

	/*
		EntityDef模块
		管理了所有的实体定义的描述以及所有的数据类型描述
	*/
    public class EntityDef
    {
		// 所有的数据类型
		public static Dictionary<string, UInt16> datatype2id = new Dictionary<string, UInt16>();
		public static Dictionary<string, KBEDATATYPE_BASE> datatypes = new Dictionary<string, KBEDATATYPE_BASE>();
		public static Dictionary<UInt16, KBEDATATYPE_BASE> id2datatypes = new Dictionary<UInt16, KBEDATATYPE_BASE>();
		
		public static Dictionary<string, Int32> entityclass = new Dictionary<string, Int32>();
		
		public static Dictionary<string, ScriptModule> moduledefs = new Dictionary<string, ScriptModule>();
		public static Dictionary<UInt16, ScriptModule> idmoduledefs = new Dictionary<UInt16, ScriptModule>();

		public static void clear()
		{
			datatype2id.Clear();
			datatypes.Clear();
			id2datatypes.Clear();
			entityclass.Clear();
			moduledefs.Clear();
			idmoduledefs.Clear();
			
			initDataType();
			bindMessageDataType();
		}

		public EntityDef()
		{
			initDataType();
			bindMessageDataType();
		}
		
		public static void initDataType()
		{
			datatypes["UINT8"] = new KBEDATATYPE_UINT8();
			datatypes["UINT16"] = new KBEDATATYPE_UINT16();
			datatypes["UINT32"] = new KBEDATATYPE_UINT32();
			datatypes["UINT64"] = new KBEDATATYPE_UINT64();
			
			datatypes["INT8"] = new KBEDATATYPE_INT8();
			datatypes["INT16"] = new KBEDATATYPE_INT16();
			datatypes["INT32"] = new KBEDATATYPE_INT32();
			datatypes["INT64"] = new KBEDATATYPE_INT64();
			
			datatypes["FLOAT"] = new KBEDATATYPE_FLOAT();
			datatypes["DOUBLE"] = new KBEDATATYPE_DOUBLE();
			
			datatypes["STRING"] = new KBEDATATYPE_STRING();
			datatypes["VECTOR2"] = new KBEDATATYPE_VECTOR2();
			datatypes["VECTOR3"] = new KBEDATATYPE_VECTOR3();
			datatypes["VECTOR4"] = new KBEDATATYPE_VECTOR4();
			datatypes["PYTHON"] = new KBEDATATYPE_PYTHON();
			datatypes["UNICODE"] = new KBEDATATYPE_UNICODE();
			datatypes["ENTITYCALL"] = new KBEDATATYPE_ENTITYCALL();
			datatypes["BLOB"] = new KBEDATATYPE_BLOB();
		}
		
		public static void bindMessageDataType()
		{
			if(datatype2id.Count > 0)
				return;
			
			datatype2id["STRING"] = 1;
			datatype2id["STD::STRING"] = 1;

			id2datatypes[1] = datatypes["STRING"];
			
			datatype2id["UINT8"] = 2;
			datatype2id["BOOL"] = 2;
			datatype2id["DATATYPE"] = 2;
			datatype2id["CHAR"] = 2;
			datatype2id["DETAIL_TYPE"] = 2;
			datatype2id["ENTITYCALL_TYPE"] = 2;

			id2datatypes[2] = datatypes["UINT8"];
			
			datatype2id["UINT16"] = 3;
			datatype2id["UNSIGNED SHORT"] = 3;
			datatype2id["SERVER_ERROR_CODE"] = 3;
			datatype2id["ENTITY_TYPE"] = 3;
			datatype2id["ENTITY_PROPERTY_UID"] = 3;
			datatype2id["ENTITY_METHOD_UID"] = 3;
			datatype2id["ENTITY_SCRIPT_UID"] = 3;
			datatype2id["DATATYPE_UID"] = 3;

			id2datatypes[3] = datatypes["UINT16"];
			
			datatype2id["UINT32"] = 4;
			datatype2id["UINT"] = 4;
			datatype2id["UNSIGNED INT"] = 4;
			datatype2id["ARRAYSIZE"] = 4;
			datatype2id["SPACE_ID"] = 4;
			datatype2id["GAME_TIME"] = 4;
			datatype2id["TIMER_ID"] = 4;

			id2datatypes[4] = datatypes["UINT32"];
			
			datatype2id["UINT64"] = 5;
			datatype2id["DBID"] = 5;
			datatype2id["COMPONENT_ID"] = 5;

			id2datatypes[5] = datatypes["UINT64"];
			
			datatype2id["INT8"] = 6;
			datatype2id["COMPONENT_ORDER"] = 6;

			id2datatypes[6] = datatypes["INT8"];
			
			datatype2id["INT16"] = 7;
			datatype2id["SHORT"] = 7;

			id2datatypes[7] = datatypes["INT16"];
			
			datatype2id["INT32"] = 8;
			datatype2id["INT"] = 8;
			datatype2id["ENTITY_ID"] = 8;
			datatype2id["CALLBACK_ID"] = 8;
			datatype2id["COMPONENT_TYPE"] = 8;

			id2datatypes[8] = datatypes["INT32"];
			
			datatype2id["INT64"] = 9;

			id2datatypes[9] = datatypes["INT64"];
			
			datatype2id["PYTHON"] = 10;
			datatype2id["PY_DICT"] = 10;
			datatype2id["PY_TUPLE"] = 10;
			datatype2id["PY_LIST"] = 10;

			id2datatypes[10] = datatypes["PYTHON"];
			
			datatype2id["BLOB"] = 11;

			id2datatypes[11] = datatypes["BLOB"];
			
			datatype2id["UNICODE"] = 12;

			id2datatypes[12] = datatypes["UNICODE"];
			
			datatype2id["FLOAT"] = 13;

			id2datatypes[13] = datatypes["FLOAT"];
			
			datatype2id["DOUBLE"] = 14;

			id2datatypes[14] = datatypes["DOUBLE"];
			
			datatype2id["VECTOR2"] = 15;

			id2datatypes[15] = datatypes["VECTOR2"];
			
			datatype2id["VECTOR3"] = 16;

			id2datatypes[16] = datatypes["VECTOR3"];
			
			datatype2id["VECTOR4"] = 17;

			id2datatypes[17] = datatypes["VECTOR4"];
			
			datatype2id["FIXED_DICT"] = 18;
			// 这里不需要绑定,FIXED_DICT需要根据不同类型实例化动态得到id
			//id2datatypes[18] = datatypes["FIXED_DICT"];
			
			datatype2id["ARRAY"] = 19;
			// 这里不需要绑定,ARRAY需要根据不同类型实例化动态得到id
			//id2datatypes[19] = datatypes["ARRAY"];

			datatype2id["ENTITYCALL"] = 20;
		}
    }
    
}