using System;
using Fort23.Core;
using UnityEngine;
using Utility.CTween;


public class CustomFloatTween : CustomTweener
{
    public CustomGetter<float> Getter;
    public CustomSetter<float> Setter;
    public float EndValue;
    public float StartValue;
    public float CurValue;

    private GameObject _target;

    public CustomFloatTween CustomInit(CustomGetter<float> getter, CustomSetter<float> setter, float endValue, float duration, GameObject target)
    {
        _target = target;
        _tempTimer = 0;
        _curTime = 0;
        Duration = 0;

        _isPause = false;
        _isKilled = false;
        _isComplete = false;

        Duration = duration;
        Getter = getter;
        Setter = setter;
        EndValue = endValue;
        StartValue = Getter();
        Update();
        return this;
    }


    public override void Update()
    {
        if (_target == null)
        {
            Kill();
            return;
        }

        if (_isPause || _isKilled || _isComplete)
        {
            return;
        }

        _isPlaying = true;
        _curTime += Time.deltaTime;
        float rate = 1 / Duration; //相对速率

        _tempTimer += Time.deltaTime * rate;
        _tempTimer = Mathf.Clamp(_tempTimer, 0, 1);
        float v = AnimationCurve.Evaluate(_tempTimer);

        float pNewValue = Mathf.Lerp(StartValue, EndValue, v);

        CurValue = pNewValue;
        Setter?.Invoke(pNewValue);
        OnUpdateAction?.Invoke();
        OnUpdateAndValueAction?.Invoke(pNewValue);

        if (_curTime >= Duration)
        {
            OnCompleteAction?.Invoke();
            _isPlaying = false;
            _isComplete = true;
            if (AutoDispose)
            {
                Kill();
            }
        }
    }


    public void ReStart(float endValue = -1, float duration = -1)
    {
        _tempTimer = 0;
        _curTime = 0;
        // Duration = 0;

        _isPause = false;
        _isKilled = false;
        _isComplete = false;

        if (Math.Abs(endValue - (-1)) > 0.001f)
        {
            EndValue = endValue;
        }

        if (Math.Abs(duration - (-1)) > 0.001f)
        {
            Duration = duration;
        }


        CustomInit(Getter, Setter, EndValue, Duration, _target);
    }


    public override void Dispose()
    {
        if (_target != null)
        {
            Setter?.Invoke(EndValue);
            OnCompleteAction?.Invoke();
        }

        base.Dispose();

        _target = null;
        Getter = null;
        Setter = null;
        CustomTweenManager.FloatRecycle(this);
    }
}