using System.Collections.Generic;
using Godot;

namespace Movementtests.systems;

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;
    private Callable _tweenEndedCallback;

    public void Init(Node3D tweenObject)
    {
        _tweenObject = tweenObject;
        _tweenEndedCallback = new Callable(this, MethodName.EndTween);
    }
	
    public void EndTween()
    {
        _isTweening = false;
    }

    public Tween TweenToLocation(TweenInputs inputs)
    {
        var (location, duration) = inputs;
		
        var tween = GetTree().CreateTween();
        tween.SetParallel(true);
        tween.TweenProperty(_tweenObject, "global_position", location, duration);
        tween.TweenCallback(_tweenEndedCallback);
        _isTweening = true;
        return tween;
    }

    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());
    }
    
}