import { useEffect } from 'react'
import * as THREE from "three";
import { useThree } from "@react-three/fiber";
import { CCDIKSolver, CCDIKHelper } from "three/examples/jsm/animation/CCDIKSolver";
import { usePlayButtonStore, useResetButtonStore } from '../../../../../store/usePlayButtonStore';

type IKInstanceProps = {
    setIkSolver: any
    armBot: ArmBotStatus;
};

function IKInstance({ setIkSolver, armBot }: IKInstanceProps) {
    const { scene } = useThree();
    const { isPlaying } = usePlayButtonStore();
    const { isReset } = useResetButtonStore();
    const targetBoneName = "Target";
    const skinnedMeshName = "link_0";

    useEffect(() => {
        let retryId: NodeJS.Timeout | null = null;

        const trySetup = () => {
            const targetMesh = scene?.getObjectByProperty("uuid", armBot.modelUuid);

            if (!targetMesh) {
                retryId = setTimeout(trySetup, 100);
                return;
            }

            const OOI: any = {};
            targetMesh.traverse((n: any) => {
                if (n.name === targetBoneName) OOI.Target_Bone = n;
                if (n.name === skinnedMeshName) OOI.Skinned_Mesh = n;
            });
            if (!OOI.Target_Bone || !OOI.Skinned_Mesh) return;
            const iks = [
                {
                    target: 7,
                    effector: 6,
                    links: [
                        {
                            index: 5,
                            enabled: true,
                            rotationMin: new THREE.Vector3(-Math.PI / 2, 0, 0),
                            rotationMax: new THREE.Vector3(Math.PI / 2, 0, 0),
                        },
                        {
                            index: 4,
                            enabled: true,
                            rotationMin: new THREE.Vector3(-Math.PI / 2, 0, 0),
                            rotationMax: new THREE.Vector3(0, 0, 0),
                        },
                        {
                            index: 3,
                            enabled: true,
                            rotationMin: new THREE.Vector3(0, 0, 0),
                            rotationMax: new THREE.Vector3(2, 0, 0),
                        },
                        { index: 1, enabled: true, limitation: new THREE.Vector3(0, 1, 0) },
                        { index: 0, enabled: false, limitation: new THREE.Vector3(0, 0, 0) },
                    ],
                },
            ];

            const solver = new CCDIKSolver(OOI.Skinned_Mesh, iks);
            setIkSolver(solver);

            // const helper = new CCDIKHelper(OOI.Skinned_Mesh, iks, 0.05)
            // scene.add(helper);
        };

        trySetup();

        return () => {
            if (retryId) clearTimeout(retryId);
        };
    }, [isPlaying, isReset]);

    return (
        <>
        </>
    )
}

export default IKInstance;