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

public class SkillRootPage : MonoBehaviour
{
    public GameObject _SkillItemPrefab;

    public RectTransform line;              // 穿插技能图标的横线,只对它的长度以及X做处理。
    private static Queue<SkillRootItem> _IdleItemPrefabs = new Queue<SkillRootItem>();      // 预设复用

    private List<SkillRootItem> _SkillItems = new List<SkillRootItem>();
    public List<SkillRootItem> SkillItems
    {
        get
        {
            return _SkillItems;
        }
    }
    private List<RectTransform> _SkillLines = new List<RectTransform>();
    private SkillRootItem _SelectedItem;

    public void InitContainer(List<SkillRootItem.SkillShowInfo> showItems, UIItemBase.ItemClick itemClick, bool isOtherPlayer = false)
    {
        ClearItems();

        showItems.Sort((showItemA, showItemB) =>
        {
            if (showItemA.SkillLearn.ShowPosX < showItemB.SkillLearn.ShowPosX)
                return -1;
            else if (showItemA.SkillLearn.ShowPosX > showItemB.SkillLearn.ShowPosX)
                return 1;
            else
            {
                if (showItemA.SkillLearn.ShowPosY > showItemB.SkillLearn.ShowPosY)
                    return -1;
                else if (showItemA.SkillLearn.ShowPosY < showItemB.SkillLearn.ShowPosY)
                    return 1;
            }
            return 0;
        });

        float minX= float.MaxValue;
        float maxX = float.MinValue;

        // 显示技能图标
        foreach (var showItem in showItems)
        {
            //if (showItem.SkillLearn.ShowPosX  || showItem.SkillLearn.ShowPosY s)
            //    continue;

            SkillRootItem skillItem = GetIdleItem();
            skillItem.ShowSkillItem(showItem, isOtherPlayer);

            // 位置计算
            float posX = showItem.SkillLearn.ShowPosX;
            float posY = showItem.SkillLearn.ShowPosY;

            minX = Mathf.Min(minX, posX);
            maxX = Mathf.Max(maxX, posX);

            skillItem._ClickEvent = itemClick;
            skillItem._PanelClickEvent = OnSkillItemSelect;
            skillItem._RectTransform.anchoredPosition = new Vector2(posX, posY);
            _SkillItems.Add(skillItem);
        }

        if(line != null)
        {
            line.anchoredPosition = new Vector2((minX + maxX) / 2, line.anchoredPosition.y);
            line.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, maxX - minX);
        }
    }

    public void SelectDefaultFirst()
    {
        if (_SkillItems.Count > 0)
        {
            _SkillItems[0].OnItemClick();
        }
    }

    public void SelectItem(SkillRootItem.SkillShowInfo selectShow)
    {
        if (selectShow == null)
        {
            SelectDefaultFirst();
            return;
        }

        foreach (var skillItem in _SkillItems)
        {
            if (skillItem.ShowSkillInfo.SkillBase == selectShow.SkillBase)
            {
                skillItem.OnItemClick();
                return;
            }
        }

        SelectDefaultFirst();
    }

    private SkillRootItem GetIdleItem()
    {
        if (_IdleItemPrefabs.Count > 0)
        {
            var idleItem = _IdleItemPrefabs.Dequeue();
            idleItem.gameObject.SetActive(true);
            return idleItem;
        }

        GameObject newItemPrefab = GameObject.Instantiate(_SkillItemPrefab);
        newItemPrefab.gameObject.SetActive(true);
        SkillRootItem skillItem = newItemPrefab.GetComponent<SkillRootItem>();
        newItemPrefab.transform.SetParent(transform);
        newItemPrefab.transform.localScale = Vector3.one;
        newItemPrefab.transform.localPosition = Vector3.zero;
        return skillItem;
    }

    //private RectTransform GetIdleLine()
    //{
    //    if (_IdleLinePrefabs.Count > 0)
    //    {
    //        var idleItem = _IdleLinePrefabs.Dequeue();
    //        idleItem.gameObject.SetActive(true);
    //        return idleItem;
    //    }

    //    GameObject newItemPrefab = GameObject.Instantiate(_SkillLinePrefab);
    //    RectTransform rectTranform = newItemPrefab.GetComponent<RectTransform>();
    //    newItemPrefab.transform.SetParent(transform);
    //    newItemPrefab.transform.localScale = Vector3.one;
    //    newItemPrefab.transform.localPosition = Vector3.zero;
    //    return rectTranform;
    //}

    private void ClearItems()
    {
        _IdleItemPrefabs.Clear();
        //_IdleLinePrefabs.Clear();
        foreach (var skillItem in _SkillItems)
        {
            skillItem.gameObject.SetActive(false);
            _IdleItemPrefabs.Enqueue(skillItem);
        }
        _SkillItems.Clear();

        //foreach (var skillLine in _SkillLines)
        //{
        //    skillLine.gameObject.SetActive(false);
        //    _IdleLinePrefabs.Enqueue(skillLine);
        //}
        //_SkillLines.Clear();
    }

    private void OnSkillItemSelect(UIItemBase skillItemBase)
    {
        _SelectedItem = skillItemBase as SkillRootItem;
        foreach (var skillItem in _SkillItems)
        {
            if (skillItem != skillItemBase)
            {
                skillItem.UnSelected();
            }
            else
            {
                skillItem.Selected();
            }
        }
    }

    private void ShowSkillDetail()
    {
        if (_SelectedItem == null)
            return;
    }

    public void RefreshEquipedTag()
    {
        foreach (var skillItem in SkillItems)
        {
            skillItem.RefreshEquipedTag();
        }
    }

}