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

/// <summary>
/// Item 基类 方便使用组件
/// </summary>
public class BaseItem : MonoBehaviour
{
    /// <summary>
    /// 存储面板上所有控件
    /// </summary>
    private readonly Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();

    /// <summary>
    /// 初始化 查找控件
    /// </summary>
    protected virtual void Awake()
    {
        FindChildrenControl<Button>();
        FindChildrenControl<Image>();
        FindChildrenControl<Text>();
        FindChildrenControl<Toggle>();
        FindChildrenControl<Slider>();
        FindChildrenControl<ScrollRect>();
        FindChildrenControl<InputField>();
        FindChildrenControl<TextMeshPro>();
        FindChildrenControl<TextMeshProUGUI>();
    }

    /// <summary>
    /// 得到对应名称的控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="controlName"></param>
    /// <returns></returns>
    public T GetControl<T>(string controlName) where T : UIBehaviour
    {
        if (controlDic.ContainsKey(controlName))
        {
            for (int i = 0; i < controlDic[controlName].Count; i++)
            {
                if (controlDic[controlName][i] is T)
                    return controlDic[controlName][i] as T;
            }
        }

        return null;
    }

    /// <summary>
    /// 查找所有子对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    private void FindChildrenControl<T>() where T : UIBehaviour
    {
        T[] controls = GetComponentsInChildren<T>(true);

        for (int i = 0; i < controls.Length; i++)
        {
            string controlName = controls[i].gameObject.name;
            if (controlDic.ContainsKey(controlName))
            {
                controlDic[controlName].Add(controls[i]);
            }
            else
            {
                controlDic.Add(controlName, new List<UIBehaviour>() {controls[i]});
            }

            if (controls[i] is Button button)
            {
                button.onClick.AddListener(() => { OnClick(controlName); });
            }
            else if (controls[i] is Toggle toggle)
            {
                toggle.onValueChanged.AddListener((value) => { OnChangeToggle(controlName, value); });
            }
            else if (controls[i] is Slider slider)
            {
                slider.onValueChanged.AddListener((value) => { OnChangeSlider(controlName, value); });
            }
            else if (controls[i] is InputField inputField)
            {
                inputField.onValueChanged.AddListener((value) => { OnChangeInputFile(controlName, value); });
            }
        }
    }

    /// <summary>
    /// 显示自己 
    /// </summary>
    public virtual void ShowMe()
    {
    }

    /// <summary>
    /// 隐藏自己
    /// </summary>
    public virtual void HideMe()
    {
    }

    /// <summary>
    /// 按钮点击事件
    /// </summary>
    /// <param name="btnName"></param>
    protected virtual void OnClick(string btnName)
    {
    }

    /// <summary>
    /// Toogle点击
    /// </summary>
    /// <param name="toogleName">toogle名称</param>
    /// <param name="isOn">状态值</param>
    protected virtual void OnChangeToggle(string toogleName, bool isOn)
    {
    }

    /// <summary>
    /// Slider拖动
    /// </summary>
    /// <param name="SliderName">Slider组件名称</param>
    /// <param name="value">数值</param>
    protected virtual void OnChangeSlider(string SliderName, float value)
    {
    }

    /// <summary>
    /// 输入框输入
    /// </summary>
    /// <param name="inputFileName">输入框名称</param>
    /// <param name="value">输入框内的值</param>
    protected virtual void OnChangeInputFile(string inputFileName, string value)
    {
    }
}