import { usePlayButtonStore, useResetButtonStore } from "../../../store/usePlayButtonStore";
import { useConveyorActions } from "./conveyor/useConveyorActions";
import { useMachineActions } from "./machine/useMachineActions";
import { useRoboticArmActions } from "./roboticArm/useRoboticArmActions";
import { useStorageActions } from "./storageUnit/useStorageUnitActions";
import { useVehicleActions } from "./vehicle/useVehicleActions";
import { useCallback, useEffect } from "react";

export function useActionHandler() {
    const { isReset } = useResetButtonStore();
    const { isPlaying } = usePlayButtonStore();
    const { handleConveyorAction, cleanup: cleanupConveyor } = useConveyorActions();
    const { handleVehicleAction, cleanup: cleanupVehicle } = useVehicleActions();
    const { handleRoboticArmAction, cleanup: cleanupRoboticArm } = useRoboticArmActions();
    const { handleMachineAction, cleanup: cleanupMachine } = useMachineActions();
    const { handleStorageAction, cleanup: cleanupStorage } = useStorageActions();

    const handleAction = useCallback((action: Action, materialId?: string) => {
        if (!action) return;

        try {
            switch (action.actionType) {
                case 'default': case 'spawn': case 'swap': case 'delay': case 'despawn':
                    handleConveyorAction(action as ConveyorAction, materialId as string);
                    break;
                case 'travel':
                    handleVehicleAction(action as VehicleAction);
                    break;
                case 'pickAndPlace':
                    handleRoboticArmAction(action as RoboticArmAction);
                    break;
                case 'process':
                    handleMachineAction(action as MachineAction);
                    break;
                case 'store':
                    handleStorageAction(action as StorageAction);
                    break;
                default:
                    console.warn(`Unknown action type: ${(action as Action).actionType}`);
            }
        } catch (error) {
            console.error('Error handling action:', error);
        }
    }, [handleConveyorAction, handleVehicleAction, handleRoboticArmAction, handleMachineAction, handleStorageAction]);

    const cleanup = useCallback(() => {
        cleanupConveyor();
        cleanupVehicle();
        cleanupRoboticArm();
        cleanupMachine();
        cleanupStorage();
    }, [cleanupConveyor, cleanupVehicle, cleanupRoboticArm, cleanupMachine, cleanupStorage]);

    useEffect(() => {
        return () => {
            cleanup();
        };
    }, [cleanup, isReset, isPlaying]);

    return {
        handleAction,
        cleanup
    };
}