using CommonAI.Data;
using CommonAI.ZoneClient;
using System.Collections.Generic;
using XmdsCommon.Message;
using XmdsCommon.Plugin;

namespace XmdsCommon.ZoneClient.XmdsClientVirtual
{
    public class XmdsClientVirtual_Actor : XmdsClientVirtual_Player
    {
        private List<string> mTeamList = null;

        protected override void MOwner_OnDoEvent(ZoneObject obj, CommonAI.Zone.ObjectEvent e)
        {
            if (e is XmdsUnitPropEventB2C)
            {
                XmdsUnitPropEventB2C evt = e as XmdsUnitPropEventB2C;
                XmdsUnitProperties props = (XmdsUnitProperties)mOwner.Info.Properties;
                props.ServerData.Prop = evt.Props;
            }
            else if (e is PlayerTeamIntoEventB2C)
            {
                PlayerTeamIntoEventB2C evt = e as PlayerTeamIntoEventB2C;
                mTeamList = evt.Members;
            }
            //else if (e is PlayerPKModeChangeEventB2C)
            //{
            //    PlayerPKModeChangeEventB2C evt = e as PlayerPKModeChangeEventB2C;
            //    mData.UnitPKInfo.CurPKMode = evt.CurMode;
            //}
            /* else if (e is SetAutoBattleB2C)
            {
                SetAutoBattleB2C evt = e as SetAutoBattleB2C;
                ZoneActor actor = obj as ZoneActor;
                actor.SendUnitGuard(evt.isAutoBattle != 0);
            }*/
            
            base.MOwner_OnDoEvent(obj, e);
        }

        public override bool IsEnemy(ZoneUnit unit)
        {
            bool ret = false;

            XmdsClientVirtual v = unit.Virtual as XmdsClientVirtual;

            if ((v is XmdsClientVirtual_Monster) || (v is XmdsClientVirtual_SummonUnit)) //怪物、召唤物或NPC按照默认方式处理.
            {
                ret = this.mOwner.Force == unit.Force ? false : true;
                return ret;
            }
            else if(v is XmdsClientVirtual_Pet)
            {
                return false;//自动选取目标时选中宠物的bug(宠物不对作为敌人)
            }
            else if (v is XmdsClientVirtual_Player)
            {
                XmdsClientVirtual_Player playerVirtual = v as XmdsClientVirtual_Player;
                PKMode m = GetPKInfo().CurPKMode;

                switch (m)
                {
                    case PKMode.Peace:
                        ret = this.mOwner.Force == unit.Force ? false : true;
                        //if (ret == true) { ret = !IsTeamMember(playerVirtual); }
                        break;
                    case PKMode.Team:
                        ret = !IsTeamMember(playerVirtual);
                        break;
                    case PKMode.All:
                        ret = (playerVirtual.GetPlayerUUID() != this.GetPlayerUUID());
                        break;
                    case PKMode.Server:
                        ret = GetServerID() == playerVirtual.GetServerID() ? false : true;
                        if (ret == true) { ret = !IsTeamMember(playerVirtual); }
                        break;
                    case PKMode.Justice:
                        ret = (playerVirtual.GetPKLv() == PKLevel.White ? false : true);
                        if (ret == true) { ret = !IsTeamMember(playerVirtual); }
                        break;
                    case PKMode.Guild:
                        ret = !IsGuildMember(playerVirtual);
                        if (ret == true) { ret = !IsTeamMember(playerVirtual); }
                        break;
                    case PKMode.force:
                        ret = GetForceID() != playerVirtual.GetForceID();
                        if (ret == true) { ret = !IsTeamMember(playerVirtual); }
                        break;
                    default: break;
                }

            }

            return ret;
        }

        public bool IsTeamMember(XmdsClientVirtual_Player pl)
        {
            bool ret = false;

            if (pl.GetPlayerUUID() == this.GetPlayerUUID()) { ret = true; }
            else
            {
                ret = _IsTeamMember(pl.GetPlayerUUID());
            }


            return ret;
        }

        private bool _IsTeamMember(string uuid)
        {
            if (mTeamList != null && mTeamList.Contains(uuid))
            {
                return true;
            }

            return false;
        }

        public void GetAllTeamMember(List<ZoneUnit> ret)
        {
            if (mTeamList != null)
            {
                foreach(var a in mTeamList)
                {

                }
            }
        }



        public bool IsGuildMember(XmdsClientVirtual_Player pl)
        {
            bool ret = false;

            string gID = GetGuildID();

            if (string.IsNullOrEmpty(gID)) { ret = false; }
            else
            {
                ret = gID == pl.GetGuildID() ? true : false;
            }

            return ret;
        }

        public override bool IsAllies(ZoneUnit unit)
        {
            return _IsTeamMember((unit.Virtual as XmdsClientVirtual).GetPlayerUUID());
        }

        public override void OnDispose(ZoneUnit owner)
        {
            if (mTeamList != null)
            {
                mTeamList.Clear();
                mTeamList = null;
            }

            base.OnDispose(owner);
        }
    }
}