using System.Collections.Generic;
using Common.Utility.CombatEvent;
using Core.Utility;
using Fort23.Core;
using Fort23.UTool;
using GameLogic.Equipment;
using UnityEngine;
using Utility;
namespace GameLogic.Bag
{
    public class BagController 
    {
        /// 
        /// 玩家的所有道具(包含货币)
        /// 
        // private List m_bagList = new List();
        
        private Dictionary m_allBagDic = new Dictionary();
        /// 
        /// 外部访问用
        /// 
        public Dictionary  allBagDic => m_allBagDic;
        public void Init()
        {
            foreach (var itemData in AccountFileInfo.Instance.playerData.ItemListData)
            {
                ItemInfo itemInfo = new ItemInfo(itemData);
                // m_bagList.Add(itemInfo);
                LogTool.Log(itemInfo.guid);
                m_allBagDic.Add(itemInfo.guid, itemInfo);
                // PlayerManager.Instance.eqController.Init(itemInfo);
            }
        }
        #region 快速添加和扣除常用道具
        /// 
        /// 加金币
        /// 
        /// 
        public void AddCoin(long count)
        {
            AddItem(GlobalParam.Item_Coin_ID, count);
        }
        /// 
        /// 扣金币
        /// 
        /// 
        public bool DeductCoin(long count)
        {
            return DeductItem(GlobalParam.Item_Coin_ID, count);
        }
        /// 
        /// 加钻石
        /// 
        /// 
        public void AddDiamond(long count)
        {
            AddItem(GlobalParam.Item_Diamond_ID, count);
        }
        /// 
        /// 扣钻石
        /// 
        /// 
        public bool DeductDiamond(long count)
        {
            return DeductItem(GlobalParam.Item_Diamond_ID, count);
        }
        /// 
        /// 加英雄经验
        /// 
        /// 
        public void AddHeroExp(long count)
        {
            AddItem(GlobalParam.Item_HeroExp_ID, count);
        }
        /// 
        /// 扣英雄经验
        /// 
        /// 
        public bool DuctHeroExp(long count)
        {
            return DeductItem(GlobalParam.Item_HeroExp_ID, count);
        }
        /// 
        /// 道具是否足够
        /// 
        /// 
        /// 
        /// 
        public bool IsEnough(ItemInfo item, long count)
        {
            if (item.config.ID <= 0)
            {
                return false;
            }
            if (item.count >= count)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// 
        /// 道具是否足够
        /// 
        /// 
        /// 
        /// 
        public bool IsEnough(int itemId, long count)
        {
            ItemInfo item = GetItemInfo(itemId);
            return IsEnough(item, count);
        }
        #endregion
        public bool AddItem(int itemId, long count, string guid = "")
        {
            string guidStr = string.IsNullOrEmpty(guid) ? itemId.ToString() : guid;
            ItemInfo item = GetItemInfo(itemId, guidStr);
            return AddItemCount(item, count);
        }
        /// 
        /// 添加道具,装备和普通道具都可以
        /// 
        /// 
        public void AddItem(List itemInfos)
        {
            for (int i = 0; i < itemInfos.Count; i++)
            {
                
                ItemInfo item = itemInfos[i];
                LogTool.Log("获得了道具"+item.itemID);
                AddItem(item);
                // //掉落的数量
                // long count = itemInfo.count.Value;
                // ItemInfo item = GetItemInfo(itemInfo);
                //
                // if (item.IsEquipItem())
                // {
                //     PlayerManager.Instance.eqController.AddEquipment(item);
                // }
                //
                
                // AddItemCount(item, count);
            }
        }
        /// 
        /// 添加道具数量,最后都走这里
        /// 
        /// 
        /// 
        /// 
        private bool AddItemCount(ItemInfo item, long count)
        {
            if (item.config.ID <= 0 && string.IsNullOrEmpty(item.guid))
            {
                return false;
            }
            item.count += count;
            
            EventManager.Instance.Dispatch(CustomEventType.ItemUpdate, new ItemUpdateData() { ItemInfo = item,Count = (int)count});
            EventManager.Instance.Dispatch(CustomEventType.AddItem, new ItemUpdateData() { ItemInfo = item,Count = (int)count});
            AccountFileInfo.Instance.SaveItemData(item);
        
            return true;
        }
        // private void AddEqToDic(ItemInfo eqItemInfo)
        // {
        //     if (eqItemInfo.eqInfo == null)
        //     {
        //         return;
        //     }
        //     
        //     int pro = eqItemInfo.eqInfo.basicEquipConfig.profession;
        //     
        //     if (m_EqDic.ContainsKey(pro))
        //     {
        //         m_EqDic[pro].Add(eqItemInfo);
        //     }
        //     else
        //     {
        //         m_EqDic.Add(pro, new List());
        //         m_EqDic[pro].Add(eqItemInfo);
        //     }
        // }
        /// 
        /// 添加道具,装备和普通道具都可以
        /// 
        /// 
        public void AddItem(ItemInfo item)
        {
            //掉落的数量
            long count = item.count.Value;
            ItemInfo itemInfo = GetItemInfo(item);
            
            // if (itemInfo.IsEquipItem())
            // {
            //     PlayerManager.Instance.eqController.AddEquipment(itemInfo);    
            // }
            AddItemCount(itemInfo, count);
        }
        // /// 
        // /// 重新加载一次所有装备
        // /// 一般用于,分解装备之后
        // /// 
        // public void ReInitAllEqItem()
        // {
        //     PlayerManager.Instance.eqController.allZyEqDic.Clear();
        //     foreach (KeyValuePair keyValuePair in m_allBagDic)
        //     {
        //         PlayerManager.Instance.eqController.AddEquipment(keyValuePair.Value);
        //     }
        // }
        public void RemoveItem(ItemInfo itemInfo, bool saveNow, bool zeroDel)
        {
            itemInfo.count.Value = 0;
            if (zeroDel)
            {
                m_allBagDic.Remove(itemInfo.guid);
            }
            AccountFileInfo.Instance.SaveItemData(itemInfo, saveNow);
        }
        public void ModifyItem(ItemInfo itemInfo, bool saveNow)
        {
            itemInfo.count.Value -= itemInfo.count.Value;
            AccountFileInfo.Instance.SaveItemData(itemInfo, saveNow);
        }
        
        /// 
        /// 获取道具信息
        /// 不传guid,默认itemId就是guid
        /// 
        /// 
        /// 
        /// 
        // public ItemInfo GetItemInfo(ItemInfo itemInfo)
        // {
        //     string guidStr = string.IsNullOrEmpty(itemInfo.guid) ? itemInfo.itemID.ToString() : itemInfo.guid;
        //
        //     if (m_allBagDic.TryGetValue(guidStr, out ItemInfo item))
        //     {
        //         return item;
        //     }
        //
        //     m_allBagDic.Add(itemInfo.guid, itemInfo);
        //
        //     return itemInfo;
        // }
        /// 
        /// 一般是掉了(随机)一个东西(ItemInfo),然后来背包找,是否之前掉过一样的
        /// 之前有,就把有的返回回去,加数量
        /// 之前无,就返回这个新东西
        /// /// 重要:加入背包管理都是通过这个方法(后续看是否优)
        /// 
        /// 
        /// 
        public ItemInfo GetItemInfo(ItemInfo itemInfo)
        {
            
            string guidStr = string.IsNullOrEmpty(itemInfo.guid) ? itemInfo.itemID.ToString() : itemInfo.guid;
            if (m_allBagDic.TryGetValue(guidStr, out ItemInfo item))
            {
                return item;
            }
            //这里要设成0是因为,随机掉落的东西,第一次进背包时,先把数量去掉(否则会掉会多加1个)
            //该方法结束后,有统一加数量的代码,看后续代码。
            itemInfo.count.Value = 0l;
            m_allBagDic.Add(itemInfo.guid, itemInfo);
            return itemInfo;
        }
        
        public long GetItemCount(int itemId)
        {
            ItemInfo itemInfo = GetItemInfo(itemId);
            return itemInfo.count.Value;
        }
        /// 
        /// 获取道具信息
        /// 不传guid,默认itemId就是guid
        /// 
        /// 
        /// 
        /// 
        public ItemInfo GetItemInfo(int itemId, string guid = "")
        {
            string guidStr = string.IsNullOrEmpty(guid) ? itemId.ToString() : guid;
            if (m_allBagDic.TryGetValue(guidStr, out ItemInfo item))
            {
                return item;
            }
            ItemInfo newItem = new ItemInfo(itemId);
            if (newItem.config.ID > 0)
            {
                m_allBagDic.Add(newItem.guid, newItem);
            }
            else
            {
                LogTool.Error("没有找到这个道具:" + itemId);
                return null;
            }
            return newItem;
        }
        
       
        
        /// 
        /// 扣除道具,最后都这里
        /// 
        /// 
        /// 
        /// 
        public bool DeductItem(ItemInfo item, long count)
        {
            if (item.config.ID <= 0)
            {
                return false;
            }
            if (item.count >= count)
            {
                item.count -= count;
            }
            else
            {
                return false;
            }
            EventManager.Instance.Dispatch(CustomEventType.ItemUpdate, new ItemUpdateData() { ItemInfo = item });
            AccountFileInfo.Instance.SaveItemData(item);
            return true;
        }
        public bool DeductItem(int itemId, long count)
        {
            ItemInfo item = GetItemInfo(itemId);
            return DeductItem(item, count);
        }
        public void DropHeroExp(Vector3 startPos_WorldPos, int showCount, int itemCount)
        {
            CombatItemShowEventData combatItemShowEventData = CombatItemShowEventData.Create();
            combatItemShowEventData.count = showCount;
            combatItemShowEventData.startPos_WorldPos = startPos_WorldPos;
            combatItemShowEventData.showName = "icon_res_upgrade_1";
            combatItemShowEventData.showType = CombatItemShowEventData.ShowType.HeroExp;
            combatItemShowEventData.addValue = itemCount;
            EventManager.Instance.Dispatch(CustomEventType.Combat_ItemShow, combatItemShowEventData);
        }
        public void DropLevelExp(Vector3 startPos_WorldPos, int showCount, int itemCount)
        {
            CombatItemShowEventData combatItemShowEventData = CombatItemShowEventData.Create();
            combatItemShowEventData.count = showCount;
            combatItemShowEventData.startPos_WorldPos = startPos_WorldPos;
            combatItemShowEventData.showName = "icon_Energy";
            combatItemShowEventData.showType = CombatItemShowEventData.ShowType.LevelExp;
            combatItemShowEventData.addValue = itemCount;
            EventManager.Instance.Dispatch(CustomEventType.Combat_ItemShow, combatItemShowEventData);
        }
        public void DropMonsterGold(Vector3 startPos_WorldPos, int showCount, int itemCount)
        {
            CombatItemShowEventData combatItemShowEventData = CombatItemShowEventData.Create();
            combatItemShowEventData.count = showCount;
            combatItemShowEventData.startPos_WorldPos = startPos_WorldPos;
            combatItemShowEventData.showName = "icon_Coin";
            combatItemShowEventData.showType = CombatItemShowEventData.ShowType.MonsterGold;
            combatItemShowEventData.addValue = itemCount;
            EventManager.Instance.Dispatch(CustomEventType.Combat_ItemShow, combatItemShowEventData);
        }
    }
}