using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GCGame.Table;
using System;

public class ClientCustomData {

    // 是否已经同步过一次服务器上的数据
    private bool hasRestoreSkillData = false;                   // 技能是否已经同步过
    public bool HasRestoreSkillData
    {
        get { return hasRestoreSkillData; }
    }

    [Serializable]
    public class CustomData
    {
        // 技能页 <技能页索引(一二三四), 技能页>
        [Serializable]
        public class SkillListStruct
        {
            public int key;

            [SerializeField]
            public UserConfigData.SkillSavePage value;
        }

        [SerializeField]
        public List<SkillListStruct> skillDic = new List<SkillListStruct>();

        //public bool ContainsKey(int key)
        //{
        //    if(skillDic == null)
        //    {
        //        return false;
        //    }

        //    for(int i = 0; i < skillDic.Count; ++i)
        //    {
        //        if(skillDic[i].key == key)
        //        {
        //            return true;
        //        }
        //    }

        //    return false;
        //}

        //public Dictionary<int, UserConfigData.SkillSavePage> skillDic = new Dictionary<int, UserConfigData.SkillSavePage>();

        // 自动吃药
        [SerializeField]
        public AutoMedicInfoStruct autoMedicInfo = new AutoMedicInfoStruct();
    }

    // 自动吃药数据
    // 实时变化,还是走引用吧
    [Serializable]
    public class AutoMedicInfoStruct
    {
        public int isAutoHpOn;
        public int isAutoMpOn;
        public float hpPercent;
        public float mpPercent;
        public List<int> autoHpIdList;
        public List<int> autoMpIdList;
        public AutoMedicInfoStruct()
        {
            isAutoHpOn = 1;
            isAutoMpOn = 1;
            hpPercent = 0.911f;
            mpPercent = 0.911f;
            autoHpIdList = new List<int> { -1 };
            autoMpIdList = new List<int> { -1 };
        }
        public AutoMedicInfoStruct(int isHpOn, int isMpOn, float hpPer, float mpPer, List<int> hpIdList, List<int> mpIdList)
        {
            isAutoHpOn = isHpOn;
            isAutoMpOn = isMpOn;
            hpPercent = hpPer;
            mpPercent = mpPer;

            if (hpIdList != null)
            {
                autoHpIdList = new List<int>();
                autoHpIdList.AddRange(hpIdList);
            }
            else
                autoHpIdList = null;

            if (mpIdList != null)
            {
                autoMpIdList = new List<int>();
                autoMpIdList.AddRange(mpIdList);
            }
            else
                autoMpIdList = null;
        }
    }

    private CustomData playerCustomData;
    public CustomData PlayerCustomData
    {
        get { return playerCustomData; }
        private set { }
    }

    private string jsonStr = "";

    public ClientCustomData()
    {
        playerCustomData = new CustomData();
    }

    // 请求以保存的数据
    public void ReqClienCustomData()
    {
        ReqClientCustomData req = new ReqClientCustomData();
        req.nilparam = 1;
        req.SendMsg();
    }

    // 存数据与服务器
    public void SaveDataToServer()
    {
        if (playerCustomData != null)
        {
            jsonStr = JsonUtility.ToJson(playerCustomData);

            ReqSaveClientCustomData req = new ReqSaveClientCustomData();
            req.data = jsonStr;
            req.SendMsg();
        }

        RefreshAutoMedicInfo();
    }

    // 保存技能页数据
    public void SaveSkillPageData()
    {
        if (playerCustomData.skillDic == null)
        {
            playerCustomData.skillDic = new List<CustomData.SkillListStruct>();
        }

        playerCustomData.skillDic.Clear();

        foreach (var skillPage in UserConfigData._SkillPages)
        {
            if(skillPage.RoleGuid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
            {
                continue;
            }

            CustomData.SkillListStruct newOne = new CustomData.SkillListStruct();
            newOne.key = skillPage.PageIdx;
            newOne.value = skillPage;
            playerCustomData.skillDic.Add(newOne);
        }

        SaveDataToServer();
    }

    // 重装服务器返回的数据到到本地
    // 该函数最好只触发一次。
    public void RestoreData(RetClientCustomData packet)
    {
        // 解析json
        CustomData packetData = JsonUtility.FromJson<CustomData>(packet.data);
        if(packetData == null)
        {
            //证明第一次加载,需要默认勾选全部药品
            UpdateAutoMedicInfo(null);
        }else
        {
            UpdateAutoMedicInfo(packetData.autoMedicInfo);
            SaveAndUpdateSkillPage(packetData.skillDic);
        }
    }

    public void UpdateAutoMedicInfo(AutoMedicInfoStruct autoMedicInfo)
    {
        // 药品
        playerCustomData.autoMedicInfo = autoMedicInfo;

        if (playerCustomData.autoMedicInfo == null)
        {
            playerCustomData.autoMedicInfo = new AutoMedicInfoStruct();

            playerCustomData.autoMedicInfo.isAutoHpOn = 1;
            playerCustomData.autoMedicInfo.isAutoMpOn = 1;
            playerCustomData.autoMedicInfo.hpPercent = 0.501f;
            playerCustomData.autoMedicInfo.mpPercent = 0.501f;

            playerCustomData.autoMedicInfo.autoHpIdList = new List<int>();
            //第一次加载
            var autoUseItemTab = TableManager.GetAutoUseItem();
            playerCustomData.autoMedicInfo.autoMpIdList = new List<int>();
            foreach (var item in autoUseItemTab)
            {
                if (item.Value.SubClassID == 4 && !playerCustomData.autoMedicInfo.autoHpIdList.Contains(item.Key))
                {
                    playerCustomData.autoMedicInfo.autoHpIdList.Add(item.Key);
                }

                if (item.Value.SubClassID == 5 && !playerCustomData.autoMedicInfo.autoMpIdList.Contains(item.Key))
                {
                    playerCustomData.autoMedicInfo.autoMpIdList.Add(item.Key);
                }
            }
        }
        else
        {
            if (playerCustomData.autoMedicInfo.autoHpIdList == null)
                playerCustomData.autoMedicInfo.autoHpIdList = new List<int> { -1 };

            if (playerCustomData.autoMedicInfo.autoMpIdList == null)
                playerCustomData.autoMedicInfo.autoMpIdList = new List<int> { -1 };
        }
    }

    public void RefreshAutoMedicInfo()
    {
        if (AutoUseMedicPanelCtrl.Instance)
            AutoUseMedicPanelCtrl.Instance.LoadMySetting();
    }

    // 更新数据
    private void SaveAndUpdateSkillPage(List<CustomData.SkillListStruct> data)
    {
        // 确保仅同步一次
        if(hasRestoreSkillData == true)
        {
            return;
        }

        if(data == null || data.Count == 0)
        {
            return;
        }

        int pageIndex;

        if(UserConfigData._SkillPages == null)
        {
            UserConfigData._SkillPages = new List<UserConfigData.SkillSavePage>();
            foreach (var kv in data)
            {
                UserConfigData._SkillPages.Add(kv.value);

                if (kv.value.IsUsing > 0)
                {
                    UserConfigData._CurSkillPage = kv.value;
                }
            }
        }
        else
        {
            // 用服务器的数据全部替换本地的数据(如果有的话)
            for (int i = 0; i < UserConfigData._SkillPages.Count; ++i)
            {
                pageIndex = UserConfigData._SkillPages[i].PageIdx;

                for(int j = 0; j < data.Count; ++j)
                {
                    if(data[j].key == pageIndex && data[j].value.RoleGuid == UserConfigData._SkillPages[i].RoleGuid)
                    {
                        UserConfigData._SkillPages[i].PageName = data[j].value.PageName;
                        UserConfigData._SkillPages[i].IsUsing = data[j].value.IsUsing;
                        UserConfigData._SkillPages[i].SkillIdxs = data[j].value.SkillIdxs;

                        if (UserConfigData._SkillPages[i].IsUsing > 0)
                        {
                            UserConfigData._CurSkillPage = UserConfigData._SkillPages[i];
                        }

                        data.RemoveAt(j);
                        break;
                    }
                }

                //if (data.ContainsKey(pageIndex) && data[pageIndex].RoleGuid == UserConfigData._SkillPages[i].RoleGuid)
                //{
                //    UserConfigData._SkillPages[i].PageName = data[pageIndex].PageName;
                //    UserConfigData._SkillPages[i].IsUsing = data[pageIndex].IsUsing;
                //    UserConfigData._SkillPages[i].SkillIdxs = data[pageIndex].SkillIdxs;

                //    if (UserConfigData._SkillPages[i].IsUsing > 0)
                //    {
                //        UserConfigData._CurSkillPage = UserConfigData._SkillPages[i];
                //    }

                //    data.Remove(pageIndex);
                //}
            }

            // 如果有比本地多的数据,继续添加
            foreach (var kv in data)
            {
                UserConfigData._SkillPages.Add(kv.value);

                if (kv.value.IsUsing > 0)
                {
                    UserConfigData._CurSkillPage = kv.value;
                }
            }
        }

        if (SkillBarLogic.Instance() != null)
        {
            hasRestoreSkillData = true;
            SkillBarLogic.Instance().RefreshSkillBarInfo();
        }
    }

    public void SortAutoItemDataList()
    {
        playerCustomData.autoMedicInfo.autoHpIdList.Sort(SortItemIdListByLevel);
        playerCustomData.autoMedicInfo.autoMpIdList.Sort(SortItemIdListByLevel);
    }

    //药品数量变化刷新
    public static int SortItemIdListByLevel(int itemA, int itemB)
    {
        if (itemA == itemB)
            return 0;

        var autoUseItemTabA = TableManager.GetAutoUseItemByID(itemA, 0);
        var autoUseItemTabB = TableManager.GetAutoUseItemByID(itemB, 0);
        var backPack = GameManager.gameManager.PlayerDataPool.BackPack;

        if (autoUseItemTabA == null || autoUseItemTabB == null)
            return itemA < itemB ? -1 : 1;

        var itemACount = backPack.GetItemCountByDataId(itemA);
        var itemBCount = backPack.GetItemCountByDataId(itemB);

        if (itemACount > 0 && itemBCount <= 0)
        {
            return -1;
        }
        else if (itemACount <= 0 && itemBCount > 0)
        {
            return 1;
        }
        else
        {
            return autoUseItemTabA.NeedLevel > autoUseItemTabB.NeedLevel ? 1 : -1;
        }
    }
}