using Godot;
using System.Collections.Generic;

public partial class XRHand : XRController3D
{
    List<PinJoint3D> joints = new();

    [Export]
    StaticBody3D body;

    [Export]
    public float Strength = 1.0f;

    public void OnPress(string name)
    {
        if (name == "select_button")
        {
            var query = new PhysicsShapeQueryParameters3D();
            var sphere = new SphereShape3D();
            sphere.Radius = 0.1f * Scale.X;
            query.Shape = sphere;
            query.CollideWithBodies = true;
            query.CollideWithAreas = false;
            query.Transform = ((Node3D)GetParent()).GlobalTransform;
            var overlaps = GetWorld3D().DirectSpaceState.IntersectShape(query);
            foreach (var fuckingcollider in overlaps)
            {
                RigidBody3D body = null;
                try
                {
                    body = (RigidBody3D)fuckingcollider["collider"];
                }
                catch (System.InvalidCastException)
                {
                    continue;
                }

                GD.Print("Detected body with mass", body.Mass);

                if (body.Mass > Strength)
                    continue;

                GD.Print("Picked up ", body);

                PinJoint3D joint = new();
                joint.NodeA = GetPathTo(body);
                joint.NodeB = GetPath();
                joints.Add(joint);

                PinJoint3D joint2 = new();
                joint2.NodeB = GetPathTo(body);
                joint2.NodeA = GetPath();
                joints.Add(joint2);

                AddChild(joint);
                body.AddChild(joint2);
            }
        }
    }

    public void OnRelease(string name)
    {
        if (name == "select_button")
        {
            foreach (var joint in joints)
                joint.QueueFree();
            joints.Clear();
        }
    }

    public void OnFloat(string name, float value)
    {
        // GD.Print("Float input:");
        // GD.Print(name);
        // GD.Print(value);
    }
}
