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

public class UIContainerMultiSelect : UIContainerSelect {

    public int multiSelectNum = -1;             // 多选的情况下,最多可选择数量,默认-1,表示可无限多选
    public UIItemMultiSelect curHightLight;          // 当前高亮选中Item。

    public override void OnSelectedObj(object obj)
    {
        ContentPos selectPos = _ValueList.Find((pos) =>
        {
            if (pos.Obj == obj)
                return true;
            return false;
        });

        if (selectPos == null)
            return;

        if (!((UIItemMultiSelect)selectPos.ShowItem).IsCanSelect())
            return;

        if (curHightLight != null)
        {
            curHightLight.UnSelected();
            ((UIItemMultiSelect)selectPos.ShowItem).Selected();
            curHightLight = (UIItemMultiSelect)selectPos.ShowItem;
        }
        else
        {
            if (_Selecteds.Count != 0)
            {
                ((UIItemMultiSelect)_Selecteds[0].ShowItem).UnSelected();
            }
            ((UIItemMultiSelect)selectPos.ShowItem).Selected();
            curHightLight = (UIItemMultiSelect)selectPos.ShowItem;
        }

        if (_IsMultiSelect)
        {
            if (_Selecteds.Contains(selectPos))
            {
                ((UIItemMultiSelect)selectPos.ShowItem).UnAdd();
                _Selecteds.Remove(selectPos);
            }
            else
            {
                // 当不存在时,仅当多选数目没到上限时,添加
                if (_Selecteds.Count < multiSelectNum)
                {
                    ((UIItemMultiSelect)selectPos.ShowItem).Add();
                    _Selecteds.Add(selectPos);
                }
                // 优化:当多选数目设置为1个时,点击其他视作替换
                else if (multiSelectNum == 1)
                {
                    ((UIItemMultiSelect)_Selecteds[0].ShowItem).UnAdd();
                    _Selecteds.RemoveAt(0);

                    ((UIItemMultiSelect)selectPos.ShowItem).Add();
                    _Selecteds.Add(selectPos);
                }
            }

            if (_SelectedCallBack != null)
            {
                _SelectedCallBack(selectPos.Obj);
            }
        }
        else
        {
            if (!_Selecteds.Contains(selectPos))
            {
                _Selecteds.Clear();
                _Selecteds.Add(selectPos);
            }
        }

        if (_SelectedCallBack != null && _Selecteds.Contains(selectPos) && !_IsMultiSelect)
        {
            _SelectedCallBack(obj);
            return;
        }

        if (_DisSelectedCallBack != null && !_Selecteds.Contains(selectPos) && !_IsMultiSelect)
        {
            _DisSelectedCallBack(obj);
            return;
        }
    }

    public override void InitSelectContent(IEnumerable list, IEnumerable selectedList, SelectedObjCallBack onSelect = null, SelectedObjCallBack onDisSelect = null, Hashtable exhash = null)
    {

        foreach (ContentPos item in _Selecteds)
        {
            if (item.ShowItem != null)
            {
                ((UIItemMultiSelect)item.ShowItem).UnSelected();
                ((UIItemMultiSelect)item.ShowItem).UnAdd();
            }
        }

        curHightLight = null;

        _SelectedCallBack = onSelect;
        _DisSelectedCallBack = onDisSelect;

        gameObject.SetActive(true);

        _SelectedList = selectedList;

        base.InitContentItem(list, OnSelectedObj, exhash);

        ShowItems();
    }

    public override List<T> GetSelecteds<T>()
    {
        List<T> selectedObjs = new List<T>();
        if (_IsMultiSelect == false)
        {
            if (_Selecteds.Count > 0)
            {
                selectedObjs.Add((T)_Selecteds[0].Obj);
            }
        }
        else
        {
            for (int i = 0; i < multiSelectNum && i < _Selecteds.Count; ++i)
            {
                if (_Selecteds[i].Obj == null)
                {
                    break;
                }

                selectedObjs.Add((T)_Selecteds[i].Obj);
            }
        }

        return selectedObjs;
    }
}