using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using Games.Item;
using System;
using UnityEngine.Events;
using GCGame.Table;

// 装备自动强化控制
// 新增中途挂起机制
public class EquipAutoOpt : MonoBehaviour
{
    private static int[] AUTO_SPEED = new int[] { 1, 2, 4 };

    public GameObject _StartBtn;
    public GameObject _StopBtn;
    public Text _SpeedLabel;

    private int _SpeedIdx;

    [Serializable]
    public class AutoCallBack : UnityEvent
    {
        public AutoCallBack() { }
    }

    [SerializeField]
    public AutoCallBack _AutoCallBack;

    [SerializeField]
    public AutoCallBack _AutoStart;

    void OnDisable()
    {
        StopAuto();
    }

    public void OnSpeedChange()
    {
        ++_SpeedIdx;
        if (_SpeedIdx == AUTO_SPEED.Length)
        {
            _SpeedIdx = 0;
        }

        _SpeedLabel.text = StrDictionary.GetClientDictionaryString("#{5303}", AUTO_SPEED[_SpeedIdx]);

        if (!_StartBtn.activeSelf)
        {
            StopAuto();
            StartAuto();
        }
    }

    public void StartAuto()
    {
        _StartBtn.SetActive(false);
        _StopBtn.SetActive(true);

        // 重置等待相关设置
        waiting = false;
        recovery = false;
        StopAllCoroutines();

        float autoTime = 1.0f / AUTO_SPEED[_SpeedIdx];
        if (_AutoStart != null)
        {
            _AutoStart.Invoke();
        }
        InvokeRepeating("CallBackInner", 0, autoTime);
    }

    public void StopAuto()
    {
        _StartBtn.SetActive(true);
        _StopBtn.SetActive(false);
        CancelInvoke();

        // 重置等待相关设置
        waiting = false;
        recovery = false;
        StopAllCoroutines();
    }

    private void CallBackInner()
    {
        // 当处于等待状态时,不执行回调
        if(waiting == true)
        {
            return;
        }
        else
        {
            _AutoCallBack.Invoke();
        }
    }

    // 等待状态
    public void TryStop(float time)
    {
        // 防止重复进入等待状态
        if (waiting == false)
        {
            waiting = true;
            StartCoroutine("Wait", 2.0f);
        }
    }

    private bool waiting = false;           // 是否处于等待状态
    private bool recovery = false;          // 是否被恢复

    // 开始等待状态
    private IEnumerator Wait(float waiteTime)
    {
        for (float i = 0.0f; i < waiteTime; i += Time.deltaTime)
        {
            if (recovery == true)
            {
                waiting = false;
                yield break;
            }

            yield return 0;
        }

        // 超过等待时间,强制停止
        StopAuto();
    }

    // 尝试恢复运行
    public void Restart()
    {
        if(waiting == true)
        {
            recovery = true;
        }
    }
}