
using Godot;


namespace Rokojori
{  
  [Tool][GlobalClass ]
  public partial class SetScreenTransform : Action
  {
    [Export]
    public Camera3D source;

    [Export]
    public Node3D target;

    [Export]
    public Vector3 screenPosition;


    protected override void _OnTrigger()
    {      
      var applyingSource = source;

      if ( Engine.IsEditorHint() )
      {
        #if TOOLS

        applyingSource = EditorInterface.Singleton.GetEditorViewport3D().GetCamera3D();

        #endif
      }

      if ( source == null )
      {
        return;
      }

      target.GlobalPosition = NormalizedScreenToWorld( applyingSource, screenPosition.XY(), screenPosition.Z );
      target.SetGlobalQuaternion( applyingSource.GlobalQuaternion() );

    }

    public static Vector3 NormalizedScreenToWorld( Camera3D camera, Vector2 normalizedPos, float depth )
    {
      var viewPort = camera.GetViewport();
      var viewportSize = viewPort.GetVisibleRect().Size;

      var screenPixelPos = new Vector2(
          normalizedPos.X * viewportSize.X,
          normalizedPos.Y * viewportSize.Y
      );

      return camera.ProjectPosition(screenPixelPos, depth);
    }
  }
}