using System.Collections.Generic;
using System.Collections;
using System.Security.Permissions;
using UnityEngine;
using Games.GlobeDefine;
using Games.Item;
using GCGame.Table;
using Games.AnimationModule;


namespace Games.LogicObj
{
    //////////////////////////////////////////////////////////////////////////
    // 法宝相关
    //////////////////////////////////////////////////////////////////////////
    public partial class Obj_OtherPlayer : Obj_Character
    {
        public readonly ObjModelRecord magicItem = new ObjModelRecord();
        private const float _magicLerpRatio = 1.5f;
        private Vector3 _offset;

        public int MagicID
        {
            get { return _magicId; }
            private set { _magicId = value; }
        }
        private int _magicId = -1;

        public void CreateMagicModel(int nMagicID)
        {
            if (MagicID != nMagicID)
            {
                MagicID = nMagicID;
                Tab_MagicWeaponActiveModel magicTable = null;
                Tab_CharModel charTable = null;
                if (MagicID > GlobeVar.INVALID_ID)
                {
                    magicTable = TableManager.GetMagicWeaponActiveModelByID(MagicID, 0);
                    if (magicTable != null)
                        charTable = TableManager.GetCharModelByID(magicTable.Model, 0);
                }

                if (charTable == null)
                    magicItem.RemoveModel();
                else
                {
                    var hashTable = new Hashtable();
                    hashTable[modelDataHashName] = magicTable;
                    magicItem.LoadModel(LoadAssetBundle.BUNDLE_PATH_MODEL, charTable.ResPath,
                        hashTable, OnAsycLoadMagic);
                }
            }
        }

        private void OnMagicCreate(ObjPartRoot magicObj, object dataTable)
        {
            var magicData = dataTable as Tab_MagicWeaponActiveModel;
            Tab_CharModel charData = null;
            // 强制修复。注:走到这一步,有可能导致老模型使用新数据。
            if (magicData == null)
                magicData = TableManager.GetMagicWeaponActiveModelByID(MagicID, 0);
            if (magicData != null)
                charData = TableManager.GetCharModelByID(magicData.Model, 0);
            magicObj.gameObject.SetLayerRecursively(gameObject.layer);
            var magicTransform = magicObj.transform;
            magicTransform.SetParent(null);
            if (charData == null)
            {
                magicTransform.localScale = Vector3.one;
                _offset = Vector3.zero;
            }
            else
            {
                magicTransform.localScale = Vector3.one * charData.Scale;
                _offset = new Vector3(magicData.PosX, magicData.PosY, magicData.PosZ);
            }
            magicTransform.position = ObjTransform.TransformPoint(_offset);
        }

        private void OnMagicDestroy(ObjPartRoot magicObj)
        {
            // 占位,暂时没有需要处理的功能
        }

        public void OnAsycLoadMagic(string modelName, ObjPartRoot resObj, ObjModelLoadResult loadResult, Hashtable hash)
        {
            // 占位,暂时没有需要处理的功能
        }
        private void UpdateMagic()
        {
            if (magicItem.model != null)
            {
                var magicTransform = magicItem.model.transform;
                var targetPos = ObjTransform.TransformPoint(_offset);
                var magicPos = Vector3.Lerp(magicTransform.position, targetPos, _magicLerpRatio * Time.deltaTime);
                magicTransform.position = magicPos;
            }
        }
    }
}