using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GCGame.Table;
using Module.Log;
using System;
using Games.Scene;
using Games.LogicObj;

// 夺旗奖励结构
public class ScoreAward : IComparable<ScoreAward>
{
    // 具体含义根据使用场景决定
    public int minLimit;        // 最底要求
    public int maxLimit;        // 最高要求

    public List<AwardItemInfo> awards = new List<AwardItemInfo>();

    public int CompareTo(ScoreAward other)
    {
        if(this.minLimit < other.minLimit)
        {
            return -1;
        }
        else if(this.minLimit > other.minLimit)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}

// 夺旗左上战况面板控制
// 字典配置
//5812	跨服据点_天_颜色	<color=#ff3e6b>
//5813	跨服据点_地_颜色	<color=#ff3e6b>
//5814	跨服据点_人_颜色	<color=#ff3e6b>
//5815	跨服据点_提示	击杀守卫怪后方能对据点进行攻击。
//5816	跨服据点_占领据点公告	{0}阵营的玩家{1}占领了{2}据点{3}!
//5817	跨服据点_击杀人数格式	(击杀{0}人)
//5818	跨服据点_分数增长格式	({0}/分)
//5819	跨服据点_未上榜描述 未上榜
//5823	跨服据点_奖励排名格式_单 第 {0}名
//5824	跨服据点_奖励排名格式_多 第 {0}-{1}名
//5825	跨服据点_参与奖励 参与奖励
//5826	跨服据点_积分描述	{0}积分完成奖励
//5827	跨服据点_积分奖励完成描述	(可领取)
//5828	跨服据点_游戏倒计时 倒计时
//5829	跨服据点_离开倒计时 离开
//5830	跨服据点_自身排行榜描述 我的排名
//5831	跨服据点_据点积分描述 据点积分
//5832	跨服据点_阵营据点数格式({0}个)
//5833	跨服据点_阵营 中立
//5834	跨服据点_阵营 天
//5835	跨服据点_阵营 地
//5836	跨服据点_阵营 人
public class CaptureFlagStatePanelCtr : MonoBehaviour {

    public static int GetCurCamp()
    {
        switch (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Force)
        {
            case 6:
                {
                    return 1;
                }
            case 7:
                {
                    return 2;
                }
            case 27:
                {
                    return 3;
                }
            default:
                return -1;
        }
    }




    public delegate void voidVector2Del(Vector2 data);

    private static CaptureFlagStatePanelCtr instance;
    public static CaptureFlagStatePanelCtr Instance
    {
        get { return instance; }
    }

    public GameObject flagPanel;                                // 旗面板
    public GameObject RankPanel;                                // 奖励/排行榜面板

    public UIContainerBase CaptureFlag;
    public UIContainerBase ranks;                               // 排行榜
    public UIContainerBase awards;                              // 积分奖励
    public Text awardDesc;                                      // 奖励
    public Text rankTitle;                                      // 排行榜
    public Text rankNum;                                        // 排行榜名次
    public Text killNum;                                        // 击杀人数
    public Text scoreTitle;                                     // 积分
    public Text scoreNum;                                       // 积分数量
    public Text scoreNum1;                                       // 积分数量
    public Text scoreDelta;                                     // 积分增长速度

    public Text scoreAwardLevel;

    public Button hideBtn;
    public Toggle flagsStateBtn;
    public Toggle rankBtn;
    public Button awardDisplayBtn;
    public Button ruleBtn;
    public Button exitBtn;
    public GameObject countDownCtr;
    public Text countDownDesc;
    public TimeDownText countDownt;
    public float calculateDelta;                                // 计算积分计算间隔
    private Coroutine countDownC;

    public Animator panelAnimator;

    public List<ScoreAward> killAwards = new List<ScoreAward>();                                            // 击杀奖励
    public List<ScoreAward> joinAwards = new List<ScoreAward>();                                            // 参与奖励
    private List<ScoreAward> scoreAwards = new List<ScoreAward>();                                          // 积分奖励
    public Text[] captureFlagText;                              // 各阵营占领数文字
    Dictionary<int, List<int>> _CaptureFalgDic = new Dictionary<int, List<int>>();
    private int currentScore = 0;                                                                           // 当前积分
    private List<CaptureFlagRankData> rankDatas = new List<CaptureFlagRankData>();

    // 夺旗排行榜数据结构
    public class CaptureFlagRankData
    {
        public int rank;
        public CrossSerFlagRankInfo packInfo;
    }

    private List<CaptureFlagItem.CaptureFlagData> _captureFlagItems = new List<CaptureFlagItem.CaptureFlagData>();

    private void Awake()
    {
        if(instance == null)
        {
            instance = this;
            Init();
        }
    }

    private void Init()
    {
        _captureFlagItems.Clear();
        var tabs = TableManager.GetCrossSerFlagPoint().Values;
        foreach(var kv in tabs)
        {
            if(kv != null)
            {
                CaptureFlagItem.CaptureFlagData captureFlagData = new CaptureFlagItem.CaptureFlagData();
                captureFlagData.tabCrossSerFlagPoint = kv;
                captureFlagData.State = 0;
                captureFlagData.CampIndex = 0;
                captureFlagData.CDTime = -1;
                _captureFlagItems.Add(captureFlagData);
            }
        }
        CaptureFlag.InitContentItem(_captureFlagItems, OnFlagClick);
        flagsStateBtn.onValueChanged.AddListener(OnFlagsStateBtnClick);
        rankBtn.onValueChanged.AddListener(OnRankBtnClick);
        awardDisplayBtn.onClick.AddListener(OnAwardDisplayBtnClick);
        ruleBtn.onClick.AddListener(OnRuleBtnClick);
        exitBtn.onClick.AddListener(OnExitBtnClick);
        hideBtn.onClick.AddListener(OnAnimBtnClick);

        // 初始显示阵营分布
        OnFlagsStateBtnClick(true);

        InitAward();
        _CaptureFalgDic = new Dictionary<int, List<int>>();
        UpdateCampFlagCount();

        panelAnimator.Play("Show");
        GCGame.Utils.HideMainTopRightUI();
    }

    private void InitAward()
    {
        scoreAwards.Clear();
        joinAwards.Clear();
        killAwards.Clear();

        // 初始化奖励
        var tabAward = TableManager.GetCrossSerFlagAward().Values;
        foreach (var tempTab in tabAward)
        {
            ScoreAward newOne = new ScoreAward();
            newOne.minLimit = tempTab.LimitMin;
            newOne.maxLimit = tempTab.LimitMax;
            int awardCount = tempTab.getItemIDCount();
            for (int i = 0; i < awardCount; ++i)
            {
                if (tempTab.GetItemIDbyIndex(i) > 0)
                {
                    AwardItemInfo newAward = new AwardItemInfo();
                    newAward.itemid = tempTab.GetItemIDbyIndex(i);
                    newAward.count = tempTab.GetItemNumbyIndex(i);
                    newAward.bind = tempTab.GetItemBindbyIndex(i) == 1 ? true : false;
                    newOne.awards.Add(newAward);
                }
                else
                {
                    break;
                }
            }

            switch (tempTab.Type)
            {
                case 0:
                    joinAwards.Add(newOne);
                    break;
                case 1:
                    scoreAwards.Add(newOne);
                    break;
                case 2:
                    killAwards.Add(newOne);
                    break;
            }
        }

        joinAwards.Sort();
        scoreAwards.Sort();
        killAwards.Sort();

        rankTitle.gameObject.SetActive(true);
        SetText(rankTitle, StrDictionary.GetClientDictionaryString("#{5830}"));
        scoreTitle.gameObject.SetActive(true);
        SetText(scoreTitle, StrDictionary.GetClientDictionaryString("#{5831}"));
    }

    private void OnFlagsStateBtnClick(bool isOn)
    {
        if (!isOn)
            return;
        flagPanel.SetActive(true);
        RankPanel.SetActive(false);
    }

    private void OnRankBtnClick(bool isOn)
    {
        if (!isOn)
            return;
        flagPanel.SetActive(false);
        RankPanel.SetActive(true);
    }

    private void OnAwardDisplayBtnClick()
    {
        UIManager.ShowUI(UIInfo.CaptureFlagAwardPanel);
    }

    public void OnRuleBtnClick()
    {
        MessageHelpLogic.ShowHelpMessage(61);
    }

    public void OnExitBtnClick()
    {
        if (Singleton<ObjManager>.Instance.MainPlayer != null)
        {
            Singleton<ObjManager>.Instance.MainPlayer.AskLeaveCopy();
        }
    }

    public void OnAnimBtnClick()
    {
        var state = panelAnimator.GetCurrentAnimatorStateInfo(0);
        if (state.IsName("Show"))
        {
            panelAnimator.Play("Hide");
        }
        else
        {
            panelAnimator.Play("Show");
        }
    }

    private void OnFlagClick(object obj)
    {
        CaptureFlagItem.CaptureFlagData captureFlagData = obj as CaptureFlagItem.CaptureFlagData;
        if (captureFlagData == null)
            return;

        Vector3 targetPos = new Vector3();
        targetPos.x = captureFlagData.tabCrossSerFlagPoint.BornPosX;
        targetPos.z = captureFlagData.tabCrossSerFlagPoint.BornPosZ;
        var point = new AutoSearchPoint(GameManager.gameManager.RunningScene, targetPos.x, targetPos.z);
        if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
        {
            GameManager.gameManager.AutoSearch.BuildPath(point);
            if (null != GameManager.gameManager.AutoSearch.Path)
            {
                GameManager.gameManager.AutoSearch.Path.autoSearchRadius = 2;
            }
        }
        
    }

    public void OnRecPacket(SynCrossSerFlagInfo datas)
    {
        if (datas.pointInfo.Count != 0)
        {
            UpdateCampFlagCount(datas);
            if (_captureFlagItems.Count<=0)
                Init();
            for (int i = 0; i < datas.pointInfo.Count; ++i)
            {
                for(int j=0;j<_captureFlagItems.Count;j++)
                {
                    if(_captureFlagItems[j].tabCrossSerFlagPoint.Id == datas.pointInfo[i].Index)
                    {
                        _captureFlagItems[j].CampIndex = datas.pointInfo[i].CampIndex;
                        _captureFlagItems[j].PointID = datas.pointInfo[i].PointID;
                        _captureFlagItems[j].GuardID = datas.pointInfo[i].GuardID;
                        _captureFlagItems[j].CDTime = datas.pointInfo[i].LastChangeCampTime;
                    }
                }
            }
        }
        CaptureFlag.RefreshItems();
        // 同步时间
        switch (datas.timetype)
        {
            case -1:
                /* do nothing */
                break;
            case 0:
                countDownCtr.SetActive(true);
                SetText(countDownDesc, StrDictionary.GetClientDictionaryString("#{5828}"));
                countDownt.Init("",datas.time,timeFormat:TimeDownText.TimeFormat.english);
                break;
            case 1:
                countDownCtr.SetActive(true);
                SetText(countDownDesc, StrDictionary.GetClientDictionaryString("#{5829}"));
                countDownt.Init("",datas.time, timeFormat: TimeDownText.TimeFormat.english);
                break;
            default:
                countDownCtr.SetActive(false);
                break;
        }

        int myRank = 0;
        
        rankDatas.Clear();
        if (datas.rankInfo.Count != 0)
        {
            for (int i = 0; i < datas.rankInfo.Count; ++i)
            {
                CaptureFlagRankData rankItem = new CaptureFlagRankData();
                rankItem.rank = i + 1;
                rankItem.packInfo = datas.rankInfo[i];

                if (datas.rankInfo[i].guid == (long)GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
                {
                    myRank = i + 1;
                }

                rankDatas.Add(rankItem);
            }
            ranks.InitContentItem(rankDatas);

            // 更新自身数据并刷新积分奖励
            if (myRank > 0)
            {
                SetText(rankNum, myRank.ToString());
            }
            else
            {
                SetText(rankNum, StrDictionary.GetClientDictionaryString("#{5819}"));
            }
        }
        
        SetText(killNum, StrDictionary.GetClientDictionaryString("#{5817}", datas.killnum.ToString()));
        SetText(scoreNum, datas.score.ToString());
        SetText(scoreNum1,datas.score.ToString());

        int foundIndex = -1;
        // 永远显示后一档奖励,当前没找到后一档奖励,则显示 "可领取"
        if (datas.score > currentScore)
        {
            for(int i = 0; i < scoreAwards.Count; ++i)
            {
                if(datas.score < scoreAwards[i].minLimit)
                {
                    foundIndex = i;
                    break;
                }
            }
        }

        if(foundIndex == -1)
        {
            int maxIndex = scoreAwards.Count - 1;
            awards.InitContentItem(scoreAwards[maxIndex].awards);
            // 显示可领取
            SetText(awardDesc, StrDictionary.GetClientDictionaryString("#{5826}", scoreAwards[maxIndex].minLimit) + StrDictionary.GetClientDictionaryString("#{5827}"));
            scoreAwardLevel.text = StrDictionary.GetClientDictionaryString("#{59016}");
        }
        else
        {
            awards.InitContentItem(scoreAwards[foundIndex].awards);
            SetText(awardDesc, StrDictionary.GetClientDictionaryString("#{5826}", scoreAwards[foundIndex].minLimit));
            scoreAwardLevel.text = StrDictionary.GetClientDictionaryString("#{5844}", scoreAwards[foundIndex].minLimit);
        }

        CalculateScoreDelta(datas);
    }

    private void OnEnable()
    {
        SetCampMark();
    }

    public void SetCampMark()
    {
        CaptureFlag.RefreshItems();
    }

    private void CalculateScoreDelta(SynCrossSerFlagInfo datas)
    {
        if(!_CaptureFalgDic.ContainsKey(GetCurCamp()))
        {
            SetText(scoreDelta, "0");
            return;
        }

        var totalAddScore = 0;
        for(int index = 0; index < _CaptureFalgDic[GetCurCamp()].Count; index++)
        {
            var tab = TableManager.GetCrossSerFlagPointByID(_CaptureFalgDic[GetCurCamp()][index], 0);
            if (tab != null)
            {
                totalAddScore += 60 / tab.AddScoreTime * tab.AddScore;
            }
        }

        string resultStr = StrDictionary.GetClientDictionaryString("#{5818}", totalAddScore);
        SetText(scoreDelta, resultStr);
    }

    private void UpdateCampFlagCount(SynCrossSerFlagInfo info = null)
    {
        if (info != null)
        {
            //变化的全部删除
            for(int index = 0; index < info.pointInfo.Count; index++)
            {
                foreach(var flagInfo in _CaptureFalgDic)
                {
                    if (flagInfo.Value.Contains(info.pointInfo[index].Index))
                        flagInfo.Value.Remove(info.pointInfo[index].Index);
                }
            }

            //重新添加变化后的数据
            for (int index = 0; index < info.pointInfo.Count; ++index)
            {
                if (_CaptureFalgDic.ContainsKey(info.pointInfo[index].CampIndex))
                {
                    if (!_CaptureFalgDic[info.pointInfo[index].CampIndex].Contains(info.pointInfo[index].Index))
                        _CaptureFalgDic[info.pointInfo[index].CampIndex].Add(info.pointInfo[index].Index);
                }
                else
                {
                    List<int> indexList = new List<int>();
                    indexList.Add(info.pointInfo[index].Index);
                    _CaptureFalgDic.Add(info.pointInfo[index].CampIndex, indexList);
                }
            }
        }

        var totalCount = 0;
        foreach (var flag in _CaptureFalgDic)
        {
            totalCount += flag.Value.Count;
        }

        if(totalCount > 15)
        foreach (var flag in _CaptureFalgDic)
        {
            Debug.LogError("CampIndex : " + flag.Key);
            string _All = "";
            for(int index = 0; index < flag.Value.Count; index++)
            {
                _All += flag.Value[index] + "\t";
            }
            Debug.LogError("Index : " + _All);
        }

    }

    private void OnDestroy()
    {
        if(instance != null)
        {
            instance = null;
        }
    }

    private void SetText(Text text, string info)
    {
        if(text.text.Equals(info))
        {
            return;
        }
        else
        {
            text.text = info;
        }
    }

    // 与服务器一致的规则,通过索引获得阵营名称
    public static string GetCampNameByIndex(int campIndex)
    {
        string campName = "";
        switch (campIndex)
        {
            case 0:
                campName = StrDictionary.GetClientDictionaryString("#{5833}");
                break;
            case 1:
                campName = StrDictionary.GetClientDictionaryString("#{5834}");
                break;
            case 2:
                campName = StrDictionary.GetClientDictionaryString("#{5835}");
                break;
            case 3:
                campName = StrDictionary.GetClientDictionaryString("#{5836}");
                break;
        }

        if(string.IsNullOrEmpty(campName))
        {
            LogModule.ErrorLog("Can't get camp name with index : " + campIndex);
        }

        return campName;
    }

    // 通过阵营索引获得对应玩家真实的势力值
    public static int GetWarForceByIndex()
    {
        return 0;
    }

    // 通过阵营索引获得阵营名称
    public static string GetSpriteNameByCamp(int campIndex, bool isBigFlag)
    {
        string spriteName = "";
        switch(campIndex)
        {
            case 0:
                spriteName = "zhong";
                break;
            case 1:
                spriteName = "tian";
                break;
            case 2:
                spriteName = "di";
                break;
            case 3:
                spriteName = "ren";
                break;
        }
 
        if(string.IsNullOrEmpty(spriteName))
        {
            LogModule.ErrorLog("Can't find sprite name by index:" + campIndex);
        }
        else if (isBigFlag && campIndex != 0)
        {
            spriteName += "Big";
        }

        return spriteName;
    }

    public void OnNpcObjBeAttacked(Obj_Character npc)
    {
        var tab = TableManager.GetCrossSerFlagConfigByID(0);

        for(int i=0;i<_captureFlagItems.Count;i++)
        {
            if(_captureFlagItems[i].PointID == npc.ServerID)
            {
                for (int j = 0; j < npc.ClientImpactInfos.Count; ++j)
                {
                    if (npc.ClientImpactInfos[j].ImpactId == tab.BuffID)
                    {
                        GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5838}"));
                        return;
                    }
                }

                if (_captureFlagItems[i].GuardID != -1)
                {
                    GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5815}"));
                }

                return;
            }
        }
    }
}