using Godot;
using Rokojori;
using System.Collections.Generic;

namespace Rokojori
{  
  [Tool]
  public partial class GizmoDrawerPlugin : EditorNode3DGizmoPlugin
  {
    public GizmoDrawerPlugin()
    {
      CreateMaterial( "main", new Color( 1, 1, 1 , 1 ) );
    }

    public override string _GetGizmoName()
    {
      return "Gizmo Drawer";
    }

    public override bool _HasGizmo( Node3D node )
    {
      return node is GizmoDrawer;
    }

    public override void _Redraw( EditorNode3DGizmo gizmo )
    {
      var gizmoDrawer = gizmo.GetNode3D() as GizmoDrawer;
      
      if ( gizmoDrawer == null )
      {
        return;
      }

      gizmoDrawer.DrawGizmo( this, gizmo );

    }

    public override string _GetHandleName( EditorNode3DGizmo gizmo, int handleId, bool secondary )
    {
      var gizmoDrawerWithHandles = gizmo.GetNode3D() as GizmoDrawerWithHandles;
      
      if ( gizmoDrawerWithHandles == null )
      {
        return null;
      }

      return gizmoDrawerWithHandles.GetHandleName( gizmo, handleId, secondary );
    }

    public override Variant _GetHandleValue( EditorNode3DGizmo gizmo, int handleId, bool secondary )
    {
      var gizmoDrawerWithHandles = gizmo.GetNode3D() as GizmoDrawerWithHandles;
      
      if ( gizmoDrawerWithHandles == null )
      {        
        return Variant.CreateFrom( (string)null );
      }

      return gizmoDrawerWithHandles.GetHandleValue( gizmo, handleId, secondary );
    }


    public override void _SetHandle( EditorNode3DGizmo gizmo, int handle_id, bool secondary, Camera3D camera, Vector2 screen_pos )
    {
      var gizmoDrawerWithHandles = gizmo.GetNode3D() as GizmoDrawerWithHandles;
      
      if ( gizmoDrawerWithHandles == null )
      {        
        return;
      }

      gizmoDrawerWithHandles.SetHandle( gizmo, handle_id, secondary, camera, screen_pos );
    }

    public override void _CommitHandle( EditorNode3DGizmo gizmo, int handle_id, bool secondary, Variant restore, bool cancel )
    {
      var gizmoDrawerWithHandles = gizmo.GetNode3D() as GizmoDrawerWithHandles;
      
      if ( gizmoDrawerWithHandles == null )
      {        
        return;
      }

      gizmoDrawerWithHandles.CommitHandle( gizmo, handle_id, secondary, restore, cancel );
    }
  }
}