using IoT3D.Framework;
using IoT3D.Framework.DataModel;
using IoT3D.Framework.Unity;

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;

public class EquipDataManager 
{
    private static Dictionary<int, EquipState> m_EquipStates;
    public static List<int> equiNos = new List<int>();
    public static RealTimeSnapshotEvent AddRealTimeSnapshotListener { get { return RPCModule.AddRealTimeSnapshotListener; } }
    public static RealTimeSnapshotEvent DeleteRealTimeSnapshotListener { get { return RPCModule.DeleteRealTimeSnapshotListener; } }
    public static EquipStateEvent EquipStateListener = new EquipStateEvent();
    private static GWUserItem userItem;

    public static void OnInit(GWUserItem userdata)
    {
        userItem = userdata;
    }
    public static bool HaveEquipNo(int equipNo)
    {
        return equiNos.Contains(equipNo);
    }

    public static EquipState GetEquipState(int equipNo)
    {
        if (m_EquipStates == null)
        {
            return EquipState.None;
        }
        if (m_EquipStates.ContainsKey(equipNo))
        {
            return m_EquipStates[equipNo];
        }
        else
        {
            return EquipState.NoCommunication;
        }
    }
    public static bool CanControlEquip(int equipNo)
    {
        if (userItem == null)
        {
            return true;
        }
        return userItem.CanControlEquip(equipNo);
    }
    public static bool CanBrowseEquip(int equipNo)
    {
        if (userItem == null)
            return true;
        return userItem.CanBrowseEquip(equipNo);
    }
    public static bool CanBrowsePage(int equipNo)
    {
        if (userItem == null)
            return true;
        return userItem.CanBrowsePage(equipNo);
    }
    public static void UpdateEquipState(EquipStateData equipStateData)
    {
        EquipStateListener?.Invoke(equipStateData);
        if(m_EquipStates==null)
        {
            m_EquipStates = new Dictionary<int, EquipState>();
        }    
        if (!m_EquipStates.ContainsKey(equipStateData.EquipNo))
        {
            m_EquipStates.Add(equipStateData.EquipNo,equipStateData.State);
        }
        else
        {
            m_EquipStates[equipStateData.EquipNo] = equipStateData.State;
        }

        EquipBaseData equipEventMessage = RPCModule.GetEquipDataItem(equipStateData.EquipNo);
        if(equipEventMessage!=null)
        {
            if(equipEventMessage.State != (int)equipStateData.State)
            {
                equipEventMessage.State = (int)equipStateData.State;
            }
        }

    }
    public static void AddRealTimeSnapshot(RealTimeEventItem realTimeEventItem)
    {
        AddRealTimeEvent(realTimeEventItem);
        AddRealTimeSnapshotListener?.Invoke(realTimeEventItem);
    }

    public static void RemoveRealTimeSnapshot(RealTimeEventItem realTimeEventItem)
    {
        RemoveRealTimeEvent(realTimeEventItem);
        DeleteRealTimeSnapshotListener?.Invoke(realTimeEventItem);
    }
    public static void AddRealTimeEvent(RealTimeEventItem realTimeEventItem)
    {
        if (realTimeEventItem.eventLevel == EventLevel.Warning)
        {
            RealTimeEventItem realTimeEvent = RPCModule.RealTimeEvents.Find(x => x.guid == realTimeEventItem.guid);
            if (realTimeEvent != null)
            {
                int index = RPCModule.RealTimeEvents.IndexOf(realTimeEvent);
                RPCModule.RealTimeEvents[index] = realTimeEventItem;
            }
            else
            {
                RPCModule.RealTimeEvents.Add(realTimeEventItem);
            }
        }
        if (realTimeEventItem.eventLevel == EventLevel.None)
        {
            RealTimeEventItem realTimeEvent = RPCModule.RealTimeEvents.Find(x => x.
            Equipno == realTimeEventItem.Equipno &&
            realTimeEventItem.Ycyxno == x.Ycyxno &&
            realTimeEventItem.EventMsg == x.EventMsg);

            if (realTimeEvent != null)
            {
                int index = RPCModule.RealTimeEvents.IndexOf(realTimeEvent);
                RPCModule.RealTimeEvents[index] = realTimeEventItem;
            }
            else
            {
                RPCModule.RealTimeEvents.Add(realTimeEventItem);
            }
        }
    }
    public static void RemoveRealTimeEvent(RealTimeEventItem realTimeEventItem)
    {
        if (RPCModule.RealTimeEvents != null)
        {
            RealTimeEventItem realTimeEvent = RPCModule.RealTimeEvents.Find(x => x.guid == realTimeEventItem.guid);

            if (realTimeEvent != null)
            {
                RPCModule.RealTimeEvents.Remove(realTimeEvent);
            }
        }
    }
    //public static void UpdateEquipItem(EquipEventMessage eventMessage)
    //{
    //    if (!m_EquipItemDics.ContainsKey(eventMessage.EquipNo))
    //    {
    //        m_EquipItemDics.Add(eventMessage.EquipNo, eventMessage);
    //        // Debug.LogError("Add:" + ycEventitem.EquipNo);
    //    }
    //    else
    //    {
    //        m_EquipItemDics[eventMessage.EquipNo] = eventMessage;
    //    }
    //}
    //public static void UpdateYCItem(YcItemData ycEventitem)
    //{
    //    if(!m_YcItemDics.ContainsKey(ycEventitem.EquipNo))
    //    {
    //        m_YcItemDics.Add(ycEventitem.EquipNo, new Dictionary<int, YcItemData>());
    //        m_YcItemDics[ycEventitem.EquipNo].Add(ycEventitem.YcNo, ycEventitem);
    //        // Debug.LogError("Add:" + ycEventitem.EquipNo);
    //    }
    //    else
    //    {
    //        Dictionary<int, YcItemData> _ycItems = m_YcItemDics[ycEventitem.EquipNo];
    //        if (_ycItems.ContainsKey(ycEventitem.YcNo))
    //        {
    //            _ycItems[ycEventitem.YcNo] = ycEventitem;
    //        }
    //        else
    //        {
    //            _ycItems.Add(ycEventitem.YcNo, ycEventitem);
    //        }
    //    }
    //}
    //public static void UpdateYXItem(YxItemData yxEventitem)
    //{
    //    if (!m_YxItemDics.ContainsKey(yxEventitem.EquipNo))
    //    {
    //        m_YxItemDics.Add(yxEventitem.EquipNo,new Dictionary<int, YxItemData>());
    //        m_YxItemDics[yxEventitem.EquipNo].Add(yxEventitem.YxNo, yxEventitem);
    //        //Debug.LogError("Add:" + yxEventitem.EquipNo);
    //    }
    //    else
    //    {
    //        Dictionary<int, YxItemData> _yxItems = m_YxItemDics[yxEventitem.EquipNo];
    //        if (_yxItems.ContainsKey(yxEventitem.YxNo))
    //        {
    //            _yxItems[yxEventitem.YxNo] = yxEventitem;
    //           // Debug.LogError("Update:" + yxEventitem.EquipNo);
    //        }
    //        else
    //        {
    //            _yxItems.Add(yxEventitem.YxNo,yxEventitem);
    //            //Debug.LogError("Add:" + yxEventitem.EquipNo);
    //        }
    //    }
    //}

    //public static List<YcItemData> GetYcChangedItems(int equipNo)
    //{
    //    if(m_YcItemDics.ContainsKey(equipNo))
    //    {
    //        return m_YcItemDics[equipNo].Values.ToList();
    //    }
    //    else
    //    {
    //       // UpdataYxChangedItem(equipNo);
    //    }
    //    return null;
    //}
    //public static List<YxItemData> GetYxChangedItems(int equipNo)
    //{
    //    if (m_YxItemDics.ContainsKey(equipNo))
    //    {
    //        return m_YxItemDics[equipNo].Values.ToList();
    //    }
    //    else
    //    {
    //        //UpdataYcChangedItem(equipNo);
    //    }
    //    return null;
    //}

    //public static EquipEventMessage GetEquipDataItem(int equipNo)
    //{
    //    if (m_EquipItemDics.ContainsKey(equipNo))
    //        return m_EquipItemDics[equipNo];
    //    return null;
    //}
    //private static readonly List<int> ycNoList = new();
    //private static readonly List<int> yxNoList = new();
    //private static async void UpdataYcChangedItem(int equipNo)
    //{
    //    if (ycNoList.Contains(equipNo))
    //    {
    //        return;
    //    }
    //    ycNoList.Add(equipNo);
    //    List<YcItemData> _ycpItems = await Entry.GetComponent<RPCComponent>().GetYcpListItemAsync(equipNo);
    //    if(_ycpItems!=null)
    //    {
    //        foreach (var item in _ycpItems)
    //        {
    //            UpdateYCItem(item);
    //        }
    //    }
    //}
    //private static async void UpdataYxChangedItem(int equipNo)
    //{
    //    if (yxNoList.Contains(equipNo))
    //        return;
    //    yxNoList.Add(equipNo);
    //    List<YxItemData> _yxpItems = await Entry.GetComponent<RPCComponent>().GetYxpListItemAsync(equipNo);
    //    if(_yxpItems !=null)
    //    {
    //        foreach (var item in _yxpItems)
    //        {
    //            UpdateYXItem(item);
    //        }
    //    }
    //}
    //public static YcItemData GetYcItem(int equipNo,int ycNo)
    //{
    //    if (m_YcItemDics.ContainsKey(equipNo))
    //    {
    //        return m_YcItemDics[equipNo].Values.ToList().Find(x=>x.EquipNo == equipNo && x.YcNo == ycNo);
    //    }
    //    return null;
    //}
    //public static YxItemData GetYxItem(int equipNo, int yxNo)
    //{
    //    if (m_YxItemDics.ContainsKey(equipNo))
    //    {
    //        return m_YxItemDics[equipNo].Values.ToList().Find(x => x.EquipNo == equipNo && x.YxNo == yxNo);
    //    }
    //    return null;
    //}
}
