using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;
using System;


public class UISubScollMenu : UIBase
{
    public RectTransform MenuContainer;
    public RectTransform _ContainerBG;
    public GameObject Sub1BtnPrefab;
    public GameObject Sub2BtnPrefab;
    public bool IsReverse = true;  //默认逆序

    private bool autoSelect = true;          // 当点开菜单时,是否默认点击第一个子菜单,ture:点击,false:不点击
    public bool AutoSelect
    {
        set { autoSelect = value; }
    }

    private Dictionary<UISubMenuItem, List<UISubMenuItem>> _SubBtns = new Dictionary<UISubMenuItem, List<UISubMenuItem>>();
    public Dictionary<UISubMenuItem, List<UISubMenuItem>> SubBtns
    {
        get
        {
            return _SubBtns;
        }
    }

    private UISubMenuItem _SelectedSub1;
    public object SelectedSub1
    {
        get
        {
            if (_SelectedSub1 == null)
                return null;
            return _SelectedSub1.MenuObj;
        }
    }

    private UISubMenuItem _SelectedSub2;
    public object SelectedSub2
    {
        get
        {
            if (_SelectedSub2 == null)
                return null;
            return _SelectedSub2.MenuObj;
        }
    }

    private Queue<UISubMenuItem> _Prefabs1 = new Queue<UISubMenuItem>();
    private Queue<UISubMenuItem> _Prefabs2 = new Queue<UISubMenuItem>();

    private int subIndex = 0;
    [Serializable]
    public class MenuClickEvent : UnityEvent<object>
    {
        public MenuClickEvent()
        {
            
        }
    }

    [SerializeField]
    private MenuClickEvent _MenuClick;

    void Update()
    {
        SetBGRect();
    }

    public void Clear()
    {
        subIndex = 0;
        foreach (var keyValue in _SubBtns)
        {
            _Prefabs1.Enqueue(keyValue.Key);
            keyValue.Key.gameObject.SetActive(false);
            foreach (var item in keyValue.Value)
            {
                _Prefabs2.Enqueue(item);
                item.gameObject.SetActive(false);
            }
        }
        MenuContainer.sizeDelta = Vector2.zero;
        _IsInitBG = false;

        _SubBtns.Clear();
        _SelectedSub1 = null;
        _SelectedSub2 = null;
    }

    public void PushMenu(object sub1Tx)
    {
        PushMenu(sub1Tx, new object[] { });
    }

    public void PushMenu(object sub1Tx, int[] sub2Txs)
    {
        var sub1 = CreateNewMenu(sub1Tx, 1);
        sub1.gameObject.SetActive(true);
        sub1.SubLevel = 1;
        sub1.UnSelected();
        sub1.CloseSubGO();

        List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
        foreach (var sub2Tx in sub2Txs)
        {
            var sub2Item = CreateNewMenu(sub2Tx, 2);
            sub2Item.SubLevel = 2;
            sub2Item.gameObject.SetActive(false);
            sub2Item.UnSelected();
            sub2Item.CloseSubGO();
            sub2.Add(sub2Item);
        }

        _SubBtns.Add(sub1, sub2);
    }

    public void PushMenu(object sub1Tx, object[] sub2Txs)
    {


        var sub1 = CreateNewMenu(sub1Tx, 1);
        sub1.gameObject.SetActive(true);
        sub1.SubLevel = 1;
        sub1.UnSelected();
        sub1.CloseSubGO();

        // 部分菜单按钮是什么?
        List<UISubMenuItem> sub2 = new List<UISubMenuItem>();
        foreach (var sub2Tx in sub2Txs)
        {
            var sub2Item = CreateNewMenu(sub2Tx, 2);
            sub2Item.SubLevel = 2;
            sub2Item.gameObject.SetActive(false);
            sub2Item.UnSelected();
            sub2Item.CloseSubGO();
            sub2.Add(sub2Item);
        }
        sub2.Reverse();

        _SubBtns.Add(sub1, sub2);
    }

    public void ShowDefaultFirst()
    {
        //_SelectedSub1 = null;
        //_SelectedSub2 = null;
        if (_SubBtns.Count > 0)
        {
            foreach (var keyValue in _SubBtns)
            {
                if (!keyValue.Key.isActiveAndEnabled)
                    continue;

                MenuClick(keyValue.Key);
                //if (keyValue.Value != null && keyValue.Value.Count > 0)
                //{
                //    for(int i = 0; i< keyValue.Value.Count; ++i)
                //    {
                //        if (!keyValue.Value[i].ShowMenu())
                //            continue;
                //        MenuClick(keyValue.Value[i]);
                //        break;
                //    } 
                //}
                break;
            }
        }
        else
        {
            MenuClick(null);
        }
    }


    public void CloseAllSub()
    {

    }

    public void HightLightMenu(object showObj)
    {
        if (_SubBtns.Count > 0)
        {
            foreach (var keyValue in _SubBtns)
            {
                if (showObj == keyValue.Key.MenuObj)
                {
                    keyValue.Key.Selected();
                }
                else
                {
                    keyValue.Key.UnSelected();
                }
            }
        }
    }

    public void ShowMenu(object showObj, object showsubObj = null)
    {
        if (showObj == null)
            return;
        //Debug.LogError("ShowObj : " + showObj);
        if (_SubBtns.Count > 0)
        {
            foreach (var keyValue in _SubBtns)
            {
               // Debug.LogError("keyValue.Key.MenuObj : " + keyValue.Key.MenuObj);
                if (showObj.Equals(keyValue.Key.MenuObj))
                {
                    //Debug.LogError("MenuClick : " + showObj);
                    //MenuClick(keyValue.Key);
                    UISubMenuItem selectedSubMenu = null; 
                    if (keyValue.Value.Count > 0)
                    {
                        foreach (var subMenu in keyValue.Value)
                        {
                            if (showsubObj.Equals(subMenu.MenuObj))
                            {
                                selectedSubMenu = subMenu;
                                //MenuClick(subMenu);
                                break;
                            }
                        }
                    }
                    if (showsubObj != null && selectedSubMenu != null)
                    {
                        MenuClick(keyValue.Key);
                        MenuClick(selectedSubMenu);
                        break;
                    }
                    else if (showsubObj == null)
                    {
                        MenuClick(keyValue.Key);
                        break;
                    }
                    
                }
            }
        }
        else
        {
            MenuClick(null);
        }
    }

    public void ShowMenu(object showObj, bool isSpecial)
    {
        if (_SubBtns.Count > 0)
        {
            foreach (var keyValue in _SubBtns)
            {
                if (keyValue.Value.Count > 0)
                {
                    foreach (var subMenu in keyValue.Value)
                    {
                        if (showObj == subMenu.MenuObj)
                        {
                            MenuClick(keyValue.Key);
                            MenuClick(subMenu);
                            break;
                        }
                    }
                }
                else
                {
                    if (showObj == keyValue.Key.MenuObj)
                    {
                        MenuClick(keyValue.Key);
                        break;
                    }
                }
            }
        }
        else
        {
            MenuClick(null);
        }
    }

    public void Refresh()
    {
        foreach (var menuBtn in _SubBtns)
        {
            menuBtn.Key.Refresh();
            foreach (var subMenu in menuBtn.Value)
            {
                subMenu.Refresh();
            }
        }
    }

    private UISubMenuItem CreateNewMenu(object tx, int level)
    {
        GameObject go;
        UISubMenuItem menuScript;

        if (level == 1)
        {
            if (_Prefabs1.Count > 0)
            {
                menuScript = _Prefabs1.Dequeue();
                go = menuScript.gameObject;
            }
            else
            {
                go = GameObject.Instantiate<GameObject>(Sub1BtnPrefab.gameObject);
                menuScript = go.GetComponent<UISubMenuItem>();
            }
        }
        else
        {
            if (_Prefabs2.Count > 0)
            {
                menuScript = _Prefabs2.Dequeue();
                go = menuScript.gameObject;
            }
            else
            {
                go = GameObject.Instantiate<GameObject>(Sub2BtnPrefab.gameObject);
                menuScript = go.GetComponent<UISubMenuItem>();
            }
        }

        menuScript.InitMenu(tx);
        go.transform.SetParent(MenuContainer.transform);
        go.transform.SetSiblingIndex(subIndex);
        ++subIndex;
        go.transform.localScale = Vector3.one;
        menuScript._PanelClickEvent = MenuClick;
        return menuScript;
    }

    public void MenuClick(UIItemBase itemBase)
    {
        UISubMenuItem menuItem = itemBase as UISubMenuItem;
        if (menuItem == null)
            return;

        
        if (menuItem.SubLevel == 1)
        {
            if (menuItem != _SelectedSub1)
            {
                ClearSelect(1);
                ClearSelect(2);
                _SelectedSub1 = menuItem;
                _SelectedSub1.Selected();
                if (_SubBtns[_SelectedSub1].Count > 0)
                {
                    _SelectedSub1.OpenSubGO();
                    //foreach (var sub2 in _SubBtns[_SelectedSub1])
                    //{
                    //    sub2.ShowMenu();
                    //}
                    for (int i = 0; i < _SubBtns[_SelectedSub1].Count; ++i)
                    {
                        if (!_SubBtns[_SelectedSub1][i].ShowMenu())
                            continue;

                        if(!IsReverse)
                        {//正序第一个
                            if(_SelectedSub2 == null)
                                _SelectedSub2 = _SubBtns[_SelectedSub1][i];
                        }
                        else
                        {
                            //逆序 倒数第一个
                            //if(_SelectedSub2 == null)
                            _SelectedSub2 = _SubBtns[_SelectedSub1][i];
                        }
                    }

                    if (_SelectedSub2 != null && autoSelect == true)
                    {
                        MenuClick(_SelectedSub2);
                        _SelectedSub2.Selected();
                        _MenuClick.Invoke(_SelectedSub2.MenuObj);
                        return;
                    }
                }
            }
            else if(_SubBtns[_SelectedSub1].Count > 0)
            {
                ClearSelect(1);
            }
        }
        else
        {
            if (menuItem != _SelectedSub2)
            {
                ClearSelect(2);
                _SelectedSub2 = menuItem;
                _SelectedSub2.Selected();
            }
        }

        _MenuClick.Invoke(menuItem.MenuObj);
    }

    public void ShowSubFirstItem()
    {
        if (_SubBtns[_SelectedSub1].Count > 0)
        {
            _SelectedSub2 = _SubBtns[_SelectedSub1][0];
            MenuClick(_SelectedSub2);
            _SelectedSub2.Selected();
            _MenuClick.Invoke(_SelectedSub2.MenuObj);
        }
    }

    public void ClearSelect(int layer)
    {
        if (layer == 2 && _SelectedSub2 != null)
        {
            _SelectedSub2.CloseSubGO();
            _SelectedSub2.UnSelected();
            _SelectedSub2 = null;
        }

        if (layer == 1 && _SelectedSub1 != null)
        {
            _SelectedSub1.CloseSubGO();
            _SelectedSub1.UnSelected();
            foreach (var sub2 in _SubBtns[_SelectedSub1])
            {
                sub2.gameObject.SetActive(false);
            }
            _SelectedSub1 = null;
        }
    }

    #region bg

    private bool _IsInitBG = false;

    public void SetBGRect()
    {
        if (_ContainerBG == null)
            return;

        if (_IsInitBG)
            return;

        if (MenuContainer.sizeDelta.y > 1)
        {
            _IsInitBG = true;
            _ContainerBG.sizeDelta = new Vector2(_ContainerBG.sizeDelta.x, MenuContainer.sizeDelta.y + 10);
        }
    }

    #endregion
}