using Godot;
using System.Collections.Generic;

public partial class TweenQueueSystem : Node3D
{
    public record TweenInputs(Vector3 Location, float Duration);
    
    private Queue<TweenInputs> _tweenInputs = new Queue<TweenInputs>();
    private Node3D _tweenObject;
    private bool _isTweening = false;

    public void Init(Node3D tweenObject)
    {
        _tweenObject = tweenObject;
    }
	
    public void EndTween()
    {
        _isTweening = false;
    }

    private void TweenToLocation(TweenInputs inputs)
    {
        var (location, duration) = inputs;
		
        var tween = GetTree().CreateTween();
        var callback = new Callable(this, MethodName.EndTween);
				
        tween.TweenProperty(_tweenObject, "position", location, duration);
        tween.TweenCallback(callback);
		
        _isTweening = true;
        tween.Play();
    }

    public void QueueTween(TweenInputs inputs)
    {
        _tweenInputs.Enqueue(inputs);
    }

    public void QueueTween(Vector3 location, float duration)
    {
        QueueTween(new TweenInputs(location, duration));
    }

    public void ProcessTweens()
    {
        if (_tweenInputs.Count > 0 && !_isTweening)
            TweenToLocation(_tweenInputs.Dequeue());
    }
    
}
