using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
using Godot;

namespace Rokojori
{  
  [Tool]
  [GlobalClass]
  public partial class AnimateTransform:SequenceAction, Animator
  { 

    [Export]
    public TransformAnimations animations;

    [Export]
    public Node3D target;

    List<Vector3> _frameValues;
    List<Vector3> _randomizations;

    public void OnAnimatorStart(){}
    public void OnAnimatorEnd(){}
    public void OnAnimatorCancel(){}


    protected override void _OnTrigger()
    {
      _frameValues = new List<Vector3>();
      _randomizations = new List<Vector3>();

      foreach ( var curve in animations.curves )
      {
        _frameValues.Add( TransformTargets.Get( target, curve.transformTarget ) );
        _randomizations.Add( curve.Randomize() );
      }

      var timeline = animations.timeline;
      var duration = animations.GetMaxDuration( _randomizations );

      var start = timeline.position;
      var end   = start + animations.GetMaxDuration( _randomizations );
       
      var sequenceID = DispatchStart(); 

      foreach ( var c in animations.curves )
      {
        AnimationManager.StartAnimation( c, target, c.animationMember );
      }
      
      TimeLineManager.ScheduleSpanIn( timeline, 0, duration, 
        ( span, type )=>
        {         
          var timeNow = timeline.position;
          var elapsed = timeNow - start;

          var index = 0;

          foreach ( var c in animations.curves )
          {
            if ( AnimationManager.IsAnimating( c, target, c.animationMember ) )
            {
              c.Apply( elapsed, target, _randomizations[ index ], _frameValues[ index ] );
            }

            index ++;
          }

          if ( type == TimeLineSpanUpdateType.End )
          {
            foreach ( var c in animations.curves )
            {
              AnimationManager.EndAnimation( c, target, c.animationMember );
            }

            DispatchEnd( sequenceID );
          }
        }
      );

      
    } 

    

    
  }
}