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

namespace MyFrameworkPure
{
    public static class ToggleGroupExtensions
    {

        private static System.Reflection.FieldInfo _toggleListMember;

        /// <summary>
        /// 获取组中的所有Toggle
        /// </summary>
        /// <param name="grp"></param>
        /// <returns></returns>
        public static IList<Toggle> GetToggles(this ToggleGroup grp)
        {
            if (_toggleListMember == null)
            {
                _toggleListMember = typeof(ToggleGroup).GetField("m_Toggles", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                if (_toggleListMember == null)
                    throw new System.Exception("UnityEngine.UI.ToggleGroup source code must have changed in latest version and is no longer compatible with this version of code.");
            }
            return _toggleListMember.GetValue(grp) as IList<Toggle>;
        }

        /// <summary>
        /// 组中所有Toggle数量
        /// </summary>
        /// <param name="grp"></param>
        /// <returns></returns>
        public static int Count(this ToggleGroup grp)
        {
            return GetToggles(grp).Count;
        }

        /// <summary>
        /// 通过索引值获取Toggle
        /// </summary>
        /// <param name="grp"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static Toggle Get(this ToggleGroup grp, int index)
        {
            return GetToggles(grp)[index];
        }

        public static void SetActiveToggleByIndex(this ToggleGroup grp, int index)
        {
            IList<Toggle> toggles = GetToggles(grp);
            toggles = toggles.OrderBy(x => x.transform.GetSiblingIndex()).ToList();
            grp.SetAllTogglesOff();
            toggles[index].isOn = true;
        }

        public static void SetActiveToggleByName(this ToggleGroup grp, string name)
        {
            IList<Toggle> toggles = GetToggles(grp);
            grp.SetAllTogglesOff();
            toggles.First(x => x.name == name).isOn = true;
        }

        public static int GetActiveIndex(this ToggleGroup grp)
        {
            Toggle activeToggle = grp.ActiveToggles().FirstOrDefault();
            if (!activeToggle)
                return -1;
            List<Toggle> toggles = grp.GetToggles().OrderBy(x => x.transform.GetSiblingIndex()).ToList();
            return toggles.IndexOf(activeToggle);
        }

    }
}