using FL.Data.Items;
using System;
using System.Collections.Generic;
using System.Linq;
using XGame.Database;
using XGame.Framework.Data;

namespace FL.Data
{
    public class ItemData : DataSingleton<ItemData>, IDisposable
    {
        private Dictionary<int, long> _itemDic = new Dictionary<int, long>(); // 拥有的道具数据
        private Dictionary<EEquipType, EquipItem> _equipIdDic = new Dictionary<EEquipType, EquipItem>(); // 身上穿戴的装备数据
        private Dictionary<long, EquipItem> _newEquipDic = new Dictionary<long, EquipItem>(); // 拥有的新装备数据

        /// <summary>
        /// 拥有的道具数量
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public long GetItemNum(int id)
        {
            if (_itemDic.ContainsKey(id))
            {
                return _itemDic[id];
            }
            return 0;
        }
        /// <summary>
        /// 更新道具数据
        /// </summary>
        /// <param name="id"></param>
        /// <param name="num"></param>
        public void OnChangeItemData(int id, long count)
        {
            if (_itemDic.ContainsKey(id))
            {
                _itemDic[id] = count;
            }
            else
            {
                _itemDic.Add(id, count);
            }
        }


        /// <summary>
        /// 获取身上穿戴的部位装备
        /// </summary>
        /// <param name="equipType"></param>
        /// <returns></returns>
        public EquipItem GetEquipData(EEquipType equipType)
        {
            if (_equipIdDic.ContainsKey(equipType))
            {
                return _equipIdDic[equipType];
            }
            return null;
        }

        /// <summary>
        /// 更换装备
        /// </summary>
        /// <param name="equipType"></param>
        /// <param name="id"></param>
        public void OnChangeEquip(EEquipType equipType, EquipItem equipData)
        {
            if (_equipIdDic.ContainsKey(equipType))
            {
                _equipIdDic[equipType] = equipData;
            }
            else
            {
                _equipIdDic.Add(equipType, equipData);
            }
        }

        public void AddNewEquip(EquipItem newEquip)
        {
            _newEquipDic.Add(newEquip.Id, newEquip);
        }
        public void RemoveNewEquip(long id)
        {
            if (_newEquipDic.ContainsKey(id))
            {
                _newEquipDic.Remove(id);
            }
        }
        public EquipItem GetNewEquip(long id)
        {
            if (_newEquipDic.ContainsKey(id))
            {
                return _newEquipDic[id];
            }
            return null;
        }
        public long GetNewEquipId()
        {
            if (_newEquipDic.Count == 0) return 0;
            return _newEquipDic.First().Value.Id;
        }

        void IDisposable.Dispose()
        {
            _itemDic.Clear();
            foreach (var item in _equipIdDic.Values)
            {
                (item as IDisposable)?.Dispose();
            }
            _equipIdDic.Clear();

            foreach (var item1 in _newEquipDic.Values)
            {
                (item1 as IDisposable)?.Dispose();
            }
            _newEquipDic.Clear();
        }
    }
}
