using System;
using System.Collections.Generic;
using UnityEngine;
/// 
/// 延迟几秒执行事件
/// 
public class WaitCallBack : MonoBehaviour
{
    internal float waitTime = 2.0f;
    public bool doOnAwake = false;
    /// 
    /// 时间到达回调
    /// 
    public Action OnCompelete;
    /// 
    /// 每帧回调
    /// 
    public Action OnWait;
    internal static Dictionary waitDic = new Dictionary();
    private float m_Time = 0;
    private bool start = false;
    private Component m_Comp;
    private void Awake()
    {
        if (doOnAwake)
        {
            Play();
        }
    }
    private void OnDisable()
    {
        Stop();
    }
    private void Update()
    {
        if (start)
        {
            m_Time += Time.deltaTime;
            if (m_Time >= waitTime)
            {
                Stop();
                if (OnCompelete != null)
                    OnCompelete(m_Comp);
            }
            if (OnWait != null && start)
                OnWait(m_Comp);
        }
    }
    internal void Play()
    {
        start = true;
    }
    internal void Restart()
    {
        m_Time = 0;
        Play();
    }
    internal void Stop()
    {
        m_Time = 0;
        start = false;
    }
    internal void Pause()
    {
        start = false;
    }
    private void OnDestroy()
    {
        if (waitDic.ContainsKey(gameObject))
        {
            waitDic.Remove(gameObject);
        }
    }
    internal void AddWaitDic(Component go)
    {
        m_Comp = go;
        waitDic.Add(go.gameObject, this);
    }
}
public static class Helper
{
    public static void DoWaitStart(this Component go)
    {
        if (GetWait(go) == null)
            return;
        GetWait(go).Play();
    }
    public static void OnWaitCompelete(this Component go, Action func)
    {
        WaitCallBack wait = GetWait(go);
        if (wait == null)
            return;
        wait.OnCompelete = func;
    }
    public static void OnWait(this Component go, Action func)
    {
        WaitCallBack wait = GetWait(go);
        if (wait == null)
            return;
        wait.OnWait = func;
    }
    public static void DoWaitRestart(this Component go)
    {
        if (GetWait(go) == null)
            return;
        GetWait(go).Restart();
    }
    public static void DoWaitStop(this Component go)
    {
        if (GetWait(go) == null)
            return;
        GetWait(go).Stop();
    }
    public static void DoWaitPause(this Component go)
    {
        if (GetWait(go) == null)
            return;
        GetWait(go).Pause();
    }
    public static WaitCallBack GetWait(Component go)
    {
        WaitCallBack wait = null;
        if (go == null)
            return null;
        WaitCallBack.waitDic.TryGetValue(go.gameObject, out wait);
        if (wait == null)
        {
            wait = go.GetComponent();
            if (wait == null)
            {
                wait = go.gameObject.AddComponent();
            }
            wait.AddWaitDic(go);
        }
        return wait;
    }
    public static void SetWait(this Component comp, float time)
    {
        WaitCallBack wait = GetWait(comp);
        if (wait != null)
        {
            wait.waitTime = time;
        }
    }
}