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

public class TeamTargetRoot : MonoBehaviour
{
    #region static call

    private static TeamTargetRoot m_Instance;
    public static TeamTargetRoot Instance()
    {
        return m_Instance;
    }
    public void Awake()
    {
        m_Instance = this;
    }

    public static void ShowTeamTarget(SelectTeamTarget selectTeamTarget)
    {
        Hashtable hash = new Hashtable();
        hash.Add("SelectTeamTarget", selectTeamTarget);

        UIManager.ShowUI(UIInfo.TeamTargetRoot, ShowUIOver, hash);
    }

    public static void ShowUIOver(bool sucess, object param)
    {
        Hashtable hash = param as Hashtable;
        if (param == null)
            return;

        SelectTeamTarget selectTeamTarget = (SelectTeamTarget)hash["SelectTeamTarget"];
        TeamTargetRoot.Instance().ShowUI(selectTeamTarget);
    }

    public static void SetDefaultLevel(int targetID, int level)
    {
        var levelMin = level - 10;
        var levelMax = level + 10;

        var targetTabs = TableManager.GetTeamTargetByID(targetID, 0);

        if (targetTabs == null || level < targetTabs.MinLV)
        {
            GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMin = 0;
            GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMax = 0;
            GameManager.gameManager.PlayerDataPool.TeamInfo.AutoTeamTargetDest = -1;
            if (targetTabs != null)
            {
                GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5169}"));
            }
            return;
        }

        levelMin = Mathf.Max(targetTabs.MinLV, levelMin);
        levelMax = Mathf.Min(targetTabs.MaxLv, levelMax);

        GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMin = levelMin;
        GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMax = levelMax;
        GameManager.gameManager.PlayerDataPool.TeamInfo.AutoTeamTargetDest = targetID;

    }


    #endregion

    public delegate void SelectTeamTarget(Tab_TeamTarget target, int levelMin, int levelMax);
    private SelectTeamTarget _SelectTeamTarget;

    public UISubScollMenu _SubMenu;
    public UIDialPanel _LevelMin;
    public UIDialPanel _LevelMax;

    private bool _InitUI = false;
    private int _SelectMin = 0;
    private int _SelectMax = 0;

    public void ShowUI(SelectTeamTarget selectTeamTarget)
    {
        _SelectMin = GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMin;
        _SelectMax = GameManager.gameManager.PlayerDataPool.TeamInfo.LastTeamLevelMax;

        if (_SelectMin < 0)
        {
            _SelectMin = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level - 10;
        }

        if (_SelectMax < 0)
        {
            _SelectMax = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level + 10;
        }

        if (_InitUI)
        {
            _SubMenu.Refresh();
            _LevelMin.SetSelectNum(_SelectMin);
            _LevelMax.SetSelectNum(_SelectMax);
            return;
        }

        _InitUI = true;
        _SelectTeamTarget = selectTeamTarget;

        var targetTabs = TableManager.GetTeamTarget().Values;
        Dictionary<string, List<Tab_TeamTarget>> menuDict = new Dictionary<string, List<Tab_TeamTarget>>();
        foreach (var targetTab in targetTabs)
        {
            if (!menuDict.ContainsKey(targetTab.ClassName))
            {
                menuDict.Add(targetTab.ClassName, new List<Tab_TeamTarget>());
            }
            menuDict[targetTab.ClassName].Add(targetTab);
        }

        foreach (var menu in menuDict)
        {
            if (menu.Value.Count == 1)
            {
                _SubMenu.PushMenu(menu.Value[0]);
            }
            else
            {
                _SubMenu.PushMenu(menu.Key, menu.Value.ToArray());
            }
        }

        Tab_TeamTarget tartTab = TableManager.GetTeamTargetByID(GameManager.gameManager.PlayerDataPool.TeamInfo.AutoTeamTargetDest, 0);
        if (tartTab == null)
        {
            _SubMenu.ShowDefaultFirst();
        }
        else
        {
            if (menuDict.ContainsKey(tartTab.ClassName))
            {
                if (menuDict[tartTab.ClassName].Count == 1)
                {
                    _SubMenu.ShowMenu(tartTab);
                }
                else
                {
                    _SubMenu.ShowMenu(tartTab.ClassName, tartTab);
                }
            }
            else
            {
                _SubMenu.ShowDefaultFirst();
            }
        }
    }

    public void BtnMenu(object menuObj)
    {
        Tab_TeamTarget menuStr = menuObj as Tab_TeamTarget;
        if (menuStr == null)
            return;

        _LevelMin.InitNum(menuStr.MinLV, menuStr.MaxLv);
        _LevelMax.InitNum(menuStr.MinLV, menuStr.MaxLv);

        int levelMin = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level - 10;
        int levelMax = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level + 10;

        _LevelMin.SetSelectNum(Mathf.Max(menuStr.MinLV, levelMin));
        _LevelMax.SetSelectNum(Mathf.Min(menuStr.MaxLv, levelMax));
    }

    public void OnBtnEnsure()
    {
        _SelectMin = _LevelMin.GetSelectedNum();
        _SelectMax = _LevelMax.GetSelectedNum();

        var target1 = _SubMenu.SelectedSub1;
        var target2 = _SubMenu.SelectedSub2;

        Tab_TeamTarget target;
        if (target2 != null)
        {
            target = target2 as Tab_TeamTarget;
        }
        else 
        {
            target = target1 as Tab_TeamTarget;
        }

        
        _SelectTeamTarget(target, _SelectMin, _SelectMax);
        

        UIManager.CloseUI(UIInfo.TeamTargetRoot);
        // 在确认完毕后需要自动点击“自动匹配”
        TeamInfoWindow.Instance().EnsureAutoTeam();
    }

    public void OnBtnClose()
    {
        UIManager.CloseUI(UIInfo.TeamTargetRoot);
    }

    public void OnHelp()
    {
        MessageHelpLogic.ShowHelpMessage(11);
    }
}