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

namespace Rokojori
{

  [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/Pointer.svg")]
  public partial class Pointer:Node3D
  {
    [Export]
    public Caster caster;

    [Export]
    public HighlightEffect defaultHighlighter;

    [ExportGroup("Read Only")]
    [Export]
    public Pointable pointable;

    public override void _Process( double delta )
    { 
      if ( caster == null )
      {
        return;
      }

      var currentCollider = caster.NumColliders() == 0 ? null : caster.GetCollider( 0 );


      var currentPointable =  currentCollider == null ? null : Nodes.Find<Pointable>( currentCollider );

      // RJLog.Log( currentCollider, currentPointable );

      if ( currentPointable == pointable )
      {
        return;
      }

      
      if ( pointable != null )
      {        
        Highlight( HighlightActionType.End, pointable );
        pointable.UpdatePointerState( this, false );
      }

      pointable = currentPointable;

      if ( pointable != null )
      {
        pointable.UpdatePointerState( this, true );
        Highlight( HighlightActionType.Start, pointable );
      }
    }

    void Highlight( HighlightActionType type, Pointable p )
    {
      if ( p.highlightTargets == null || p.highlightTargets.Length == 0  )
      {
        return;
      }

      if ( p.highlightEffect == null && defaultHighlighter == null )
      {
        return;
      }

      var highlightEffect = p.highlightEffect ?? defaultHighlighter;

      highlightEffect.Highlight( type, p.highlightTargets );
    
    }
  }
}