//**********************************************//
//作者:#何健#
//日期:#2020.02.13#
//简述:#装备数据结构#
//*********************************************//
using UnityEngine;
using System;
using System.Collections.Generic;

using Thousandto.Cfg.Data;
using Thousandto.Code.Global;
using Thousandto.Code.Center;
using MSG_ImmortalEquip;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 类Equipment说明
    /// </summary>
    public class ImmortalEquip: ItemBase
    {
        #region//静态变量
        #endregion

        #region //私有变量 
        private DeclareEquip _equip;         //装备表数据
        private uint _power;

        //基础属性
        private Dictionary<int, ulong> _baseAttrs;
        private Dictionary<int, ulong> _specialAttrs;

        private MSG_backpack.ItemInfo _itemInfoFromServer;

        #endregion

        #region //属性
        public DeclareEquip ItemInfo
        {
            get
            {
                return _equip;
            }
        }
        #endregion

        #region//继承父类
        public override bool Initialization()
        {
            base.Initialization();
            _equip = DeclareEquip.Get( CfgID );
            if (_equip == null)
            {
                //Debug.LogError("equip info initialization declareequip is null id = " + CfgID);
            }
            return true;
        }

        public override void UnInitialization()
        {
            _baseAttrs.Clear();
        }

        public override int GetItemType()
        {
            return ItemType.ImmortalEquip;
        }
        public override string GetName()
        {
            string ret = "";
            if (null != ItemInfo)
            {
                ret = ItemInfo.Name;
            }
            return ret;
        }
        public override int GetIcon()
        {
            int ret = -1;
            if (ItemInfo != null)
                ret = ItemInfo.Icon;
            return ret;
        }
        public override int GetEffect()
        {
            int ret = -1;
            if (ItemInfo != null)
                ret = ItemInfo.Effect;
            return ret;
        }
        public override int GetQuality()
        {
            int ret = -1;
            if (ItemInfo != null)
                ret = ItemInfo.Quality;
            return ret;
        }
        public override int GetStarNum()
        {
            var ret = 0;
            if (ItemInfo != null)
                ret = ItemInfo.DiamondNumber;
            return ret;
        }
        public override string GetOcc()
        {
            if (ItemInfo != null)
            {
                return ItemInfo.Gender;
            }
            return "";
        }
        public override int GetPart()
        {
            var ret = -1;
            if (ItemInfo != null)
                ret = ItemInfo.Part;
            return ret;
        }
        public override int GetGrade()
        {
            var ret = 0;
            if (ItemInfo != null)
                ret = ItemInfo.Grade;
            return ret;
        }
        public override uint GetPower()
        {
            return _power;
        }

        public override bool IsCanUse( int useType = ItemOpertion.Use )
        {
            return base.IsCanUse( useType );
        }

        public override bool CheckLevel( int level )
        {
            return ItemInfo.Level <= level;
        }

        public override bool CheackOcc( int sex )
        {
            if (Occ.IndexOf("9") >= 0)
                return true;
            bool ret = false;
            if (ItemInfo.Gender.IndexOf(sex.ToString()) >= 0)
            {
                ret = true;
            }
            else
            {
                ret = false;
            }
            return ret;
        }

        public override bool CheckBetterThanDress()
        {
            var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressBackEquip(Part);
            if(dressEquip != null)
            {
                return Power > dressEquip.Power;
            }
            return true;
        }

        public override bool CheckCanEquip()
        {
            var lp = GameCenter.GameSceneSystem.GetLocalPlayer();
            if(lp != null)
            {
                return CheackOcc((int)lp.Occ) && CheckLevel(lp.Level) && !isTimeOut();
            }
            return false;
        }

        public override bool CheckClass()
        {
            //if (Occ == 9)
            //    return true;
            //LocalPlayer p = GameCenter.GameSceneSystem.GetLocalPlayer();
            //if (p != null)
            //{
            //    int curID = ((int)p.Occ + 1) * 1000 + p.GradeLevel;
            //    if (curID >= ItemInfo.Classlevel)
            //    {
            //        return true;
            //    }
            //    else
            //    {
            //        return false;
            //    }
            //}
            //return false;
            return true;
        }

        public override bool isTimeOut()
        {
            return base.isTimeOut();
        }

        public override bool IsNeedSecond( int useType = ItemOpertion.Use )
        {
            bool ret= false;
            if (ItemInfo == null)
            {
                return false;
            }
            switch ( useType )
            {
                case ItemOpertion.Use:
                ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
                break;
                case ItemOpertion.Split:
                ret = false;
                break;
                case ItemOpertion.Sell:
                case ItemOpertion.Stall:
                case ItemOpertion.Resolve:
                ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
                break;
            }
            return ret;
        }

        public override bool IsUsedInBatches()
        {
            return false;
        }

        //检测是否可以上架
        public override bool CanAuction()
        {
            if (!GameCenter.MainFunctionSystem.FunctionIsVisible(FunctionStartIdCode.Auchtion))
                return false;
            if (IsBind)
                return false;
            if (ItemInfo.AuctionMaxPrice == 0)
                return false;
            return true;
        }
        //使用物品
        public override void UseItem()
        {
            if (CheckCanEquip())
            {
                ReqInlayImmortalEquip msg = new ReqInlayImmortalEquip();
                msg.UID = DBID;
                msg.Send();
            }
            else
                GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.C_EQUIP_WEAR_FIALD));
        }

        //获取和已穿戴装备的战斗力差
        public override int GetDressPowerDiff()
        {
            var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part);
            if (dressEquip != null)
            {
                return (int)Power - (int)dressEquip.Power;
            }
            return (int)Power;
        }
        #endregion

        #region//公共接口
        public ImmortalEquip( MSG_backpack.ItemInfo info ):
            base(info)
        {
            Initialization();
            SetAttribute();

            _itemInfoFromServer = info;
        }

        public ImmortalEquip( ImmortalEquip info ):
            base(info)
        {
            Initialization();
            SetAttribute();
        }

        public string ToProtoBufferBytes()
        {
            byte[] bytes = Plugins.Common.ProtoBufUtils.Serialize(_itemInfoFromServer);
            return Convert.ToBase64String(bytes);
        }

        public static ImmortalEquip ToEquipment(string str)
        {
            ImmortalEquip result;
            byte[] message = Convert.FromBase64String(str);
            MSG_backpack.ItemInfo itemInfo = new MSG_backpack.ItemInfo();
            Plugins.Common.ProtoBufUtils.Deserialize(itemInfo, message);
            result = new ImmortalEquip(itemInfo);

            return result;
        }

        public ImmortalEquip(int id) :
            base(id)
        {
            Initialization();
            SetAttribute();
        }

        /// <summary>
        /// 获取装备的最基本的属性值
        /// </summary>
        /// <returns>属性类型,属性值</returns>
        public Dictionary<int , ulong> GetBaseAttribute()
        {
            if (_baseAttrs != null)
                return _baseAttrs;
            return new Dictionary<int, ulong>();
        }

        /// <summary>
        /// 获取装备的最基本的属性值
        /// </summary>
        /// <returns>属性类型,属性值</returns>
        public Dictionary<int, ulong> GetSpecialAttribute()
        {
            if (_specialAttrs != null)
                return _specialAttrs;
            return new Dictionary<int, ulong>();
        }

        //是否有效
        public override bool IsValid()
        {
            return _equip != null;
        }
#endregion

#region//私有方法
        /// <summary>
        /// 计算当前装备的属性值
        /// </summary>
        /// <param name="level"></param>
        /// <returns>属性类型,增加的属性值</returns>
        private void SetAttribute()
        {
            if (Equipment.EquipBaseAttDic == null)
            {
                Equipment.EquipBaseAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
            }
            if (_equip == null) return;
            if (Equipment.EquipBaseAttDic.ContainsKey(_equip.Id))
            {
                _baseAttrs = Equipment.EquipBaseAttDic[_equip.Id];
            }
            else
            {
                if (_baseAttrs == null)
                    _baseAttrs = new Dictionary<int, ulong>();
                _baseAttrs.Clear();
        
                var attrsArr = _equip.Attribute1.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < attrsArr.Length; i++)
                {
                    string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
                    if (attrs.Length == 2)
                    {
                        int iType = int.Parse(attrs[0]);
                        int baseAttr = int.Parse(attrs[1]);
                        if (_baseAttrs.ContainsKey(iType))
                            continue;
                        _baseAttrs.Add(iType, (ulong)baseAttr);
                    }
                }
                //将属性缓存起来,下次使用的时候不会再次GC
                Equipment.EquipBaseAttDic[_equip.Id] = _baseAttrs;
            }

            if (Equipment.EquipSpecialAttDic == null)
            {
                Equipment.EquipSpecialAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
            }
            if (Equipment.EquipSpecialAttDic.ContainsKey(_equip.Id))
            {
                _specialAttrs = Equipment.EquipSpecialAttDic[_equip.Id];
            }
            else
            {
                if (_specialAttrs == null)
                    _specialAttrs = new Dictionary<int, ulong>();
                _specialAttrs.Clear();
                var attrsArr = _equip.Attribute2.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < attrsArr.Length; i++)
                {
                    string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
                    if (attrs.Length == 2)
                    {
                        int iType = int.Parse(attrs[0]);
                        int baseAttr = int.Parse(attrs[1]);
                        if (_specialAttrs.ContainsKey(iType))
                            continue;
                        _specialAttrs.Add(iType, (ulong)baseAttr);
                    }
                }
                //将属性缓存起来,下次使用的时候不会再次GC
                Equipment.EquipSpecialAttDic[_equip.Id] = _specialAttrs;
            }
            _power = FightPowerHelper.GetPropetryPower(_baseAttrs) + FightPowerHelper.GetPropetryPower(_specialAttrs);
        }
#endregion

#region //辅助方法  此为静态方法

        //装备的类型名字
        public static string GetEquipNameWithType( int iType )
        {
            string ret = null;
            var type = iType;
            if (type < 400)
            {
                if (type == XianJiaType.XianJiaWeapon || (iType - (int)XianJiaType.XianJiaWeapon) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE30);
                else if (type == XianJiaType.XianJiaClothes || (iType - (int)XianJiaType.XianJiaClothes) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE31);
                else if (type == XianJiaType.XianJiaRing || (iType - (int)XianJiaType.XianJiaRing) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE32);
                else if (type == XianJiaType.XianJiaZhenD || (iType - (int)XianJiaType.XianJiaZhenD) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE33);
                else if (type == XianJiaType.XianJiaLeftP || (iType - (int)XianJiaType.XianJiaLeftP) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE34);
                else if (type == XianJiaType.XianJiaRightP || (iType - (int)XianJiaType.XianJiaRightP) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE35);
                else if (type == XianJiaType.XianJiaHelmet || (iType - (int)XianJiaType.XianJiaHelmet) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE36);
                else if (type == XianJiaType.XianJiaShoulder || (iType - (int)XianJiaType.XianJiaShoulder) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE37);
                else if (type == XianJiaType.XianJiaHuWan || (iType - (int)XianJiaType.XianJiaHuWan) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE38);
                else if (type == XianJiaType.XianJiaShouT || (iType - (int)XianJiaType.XianJiaShouT) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE39);
                else if (type == XianJiaType.XianJiaNeiCen || (iType - (int)XianJiaType.XianJiaNeiCen) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE40);
                else if (type == XianJiaType.XianJiaBelt || (iType - (int)XianJiaType.XianJiaBelt) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE41);
                else if (type == XianJiaType.XianJiaLeg || (iType - (int)XianJiaType.XianJiaLeg) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE42);
                else if (type == XianJiaType.XianJiaShoe || (iType - (int)XianJiaType.XianJiaShoe) % 14 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE43);
            }
            else
            {             
                if (type == XianJiaType.YangBaGua || (type - XianJiaType.YangBaGua) % 10 == 0)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE401);
                else if (type == XianJiaType.YinBaGua || (type - XianJiaType.YangBaGua) % 10 == 1)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE402);
                else if (type == XianJiaType.BaGua1 || (type - XianJiaType.YangBaGua) % 10 == 2)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE403);
                else if (type == XianJiaType.BaGua2 || (type - XianJiaType.YangBaGua) % 10 == 3)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE404);
                else if (type == XianJiaType.BaGua3 || (type - XianJiaType.YangBaGua) % 10 == 4)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE405);
                else if (type == XianJiaType.BaGua4 || (type - XianJiaType.YangBaGua) % 10 == 5)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE406);
                else if (type == XianJiaType.BaGua5 || (type - XianJiaType.YangBaGua) % 10 == 6)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE407);
                else if (type == XianJiaType.BaGua6 || (type - XianJiaType.YangBaGua) % 10 == 7)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE408);
                else if (type == XianJiaType.BaGua7 || (type - XianJiaType.YangBaGua) % 10 == 8)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE409);
                else if (type == XianJiaType.BaGua8 || (type - XianJiaType.YangBaGua) % 10 == 9)
                    ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_IMMORTALEQUIP_TYPE410);
            }

            return ret;
        }
        #endregion
    }
}