using CommonAI.ZoneClient;
using CommonAI.Zone.Helper;
using UnityEngine;
using CommonAIClient.Unity.Utils;

namespace CommonAIClient.Unity.Battle
{
    public enum WeaponPart
    {
        WEAPON_LEFT,
        WEAPON_RIGHT,
    }
    public partial class ComAIUnit : ComAICell
    {
        private GameObject mAvatarRoot;

        protected ZoneUnit ZUnit { get { return ZObject as ZoneUnit; } }
        public byte Force { get { return this.ZUnit.Force; } }
        public float BodyHeight { get { return this.ZUnit.Info.BodyHeight; } }
        public float BodySize { get { return this.ZUnit.BodySize; } }
        public int MaxHP { get { return this.ZUnit.MaxHP; } }
        public int MP { get { return this.ZUnit.MP; } }
        public string FileName { get { return this.ZUnit.Info.FileName; } }


        public ComAIUnit(BattleScene battleScene, ZoneUnit obj)
            : base(battleScene, obj)
        {
            mAvatarRoot = new GameObject("AvatarRoot");
            mAvatarRoot.ParentRoot(this.DisplayRoot);

            InitActionStatus();

            this.ZUnit.OnActionChanged += ZUnit_OnActionChanged;
            this.ZUnit.OnLaunchSkill += ZUnit_OnLaunchSkill;
            this.ZUnit.OnSkillActionChanged += ZUnit_OnSkillActionChanged;
            this.ZUnit.OnSkillActionStart += ZUnit_OnSkillActionStart;

            this.ZUnit.OnBuffAdded += ZUnit_OnBuffAdded;
            this.ZUnit.OnBuffChanged += ZUnit_OnBuffChanged;
            this.ZUnit.OnBuffRemoved += ZUnit_OnBuffRemoved;

            //加载模型
            BattleFactroy.Instance.GameObjectAdapter.Load(
                this.ZUnit.Info.FileName,
                System.IO.Path.GetFileNameWithoutExtension(this.ZUnit.Info.FileName),
                (succ, aoe) =>
                {
                    if (this.IsDisposed)
                    {
                        BattleFactroy.Instance.GameObjectAdapter.Unload(aoe);
                        return;
                    }

                    OnLoadModelFinish(succ, aoe);
                });
        }

        protected virtual void OnLoadModelFinish(bool success, AssetObjectExt aoe)
        {
            if (success)
            {
                this.DisplayCell.Model = aoe;
                CorrectDummyNode();
            }
        }

        protected override void OnDispose()
        {
            this.ZUnit.OnActionChanged -= ZUnit_OnActionChanged;
            this.ZUnit.OnLaunchSkill -= ZUnit_OnLaunchSkill;
            this.ZUnit.OnSkillActionChanged -= ZUnit_OnSkillActionChanged;
            this.ZUnit.OnSkillActionStart -= ZUnit_OnSkillActionStart;

            this.ZUnit.OnBuffAdded -= ZUnit_OnBuffAdded;
            this.ZUnit.OnBuffChanged -= ZUnit_OnBuffChanged;
            this.ZUnit.OnBuffRemoved -= ZUnit_OnBuffRemoved;

            if (this.ZUnit.Info.RemovedEffect != null)
            {
                PlayEffect(this.ZUnit.Info.RemovedEffect, ObjectRoot.Position(), ObjectRoot.Rotation());
            }

            foreach (var elem in mBuffs)
            {
                elem.Value.Dispose();
            }
            mBuffs.Clear();

            foreach (var elem in mAvatarStack)
            {
                elem.DisplayCell.Dispose();
            }
            mAvatarStack.Clear();

            base.OnDispose();
        }

        protected override void OnUpdate(float deltaTime)
        {
            base.OnUpdate(deltaTime);
            UpdateAction(deltaTime);
            UpdateBuff(deltaTime);
        }

        protected virtual void ZUnit_OnLaunchSkill(ZoneUnit unit, ZoneUnit.SkillState skill
            , CommonAI.Zone.UnitLaunchSkillEvent evt)
        {
            this.ChangeAction(UnitActionStatus.Skill);
            if (this.CurrentActionStatus is SkillActionStatus)
            {
                (this.CurrentActionStatus as SkillActionStatus).ZUnit_OnLaunchSkill(this, skill, evt);
            }
        }

        protected virtual void ZUnit_OnSkillActionStart(ZoneUnit unit, ZoneUnit.ISkillAction action)
        {
            if (this.CurrentActionStatus is SkillActionStatus)
            {
                (this.CurrentActionStatus as SkillActionStatus).OnStart(this);
            }
        }

        protected virtual void ZUnit_OnSkillActionChanged(ZoneUnit unit, ZoneUnit.SkillState skill, byte index)
        {
            if (this.CurrentActionStatus is SkillActionStatus)
            {
                (this.CurrentActionStatus as SkillActionStatus).ZUnit_OnSkillActionChanged(this, index);
            }
        }

        protected virtual void ZUnit_OnActionChanged(ZoneUnit unit, CommonAI.Zone.Helper.UnitActionStatus status, object evt)
        {
            this.ChangeAction(status);
        }
    }
}