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() {
    // Initialize all action handlers
    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();

    // Main handler function
    const handleAction = useCallback((action: Action) => {
        if (!action) return;

        try {
            switch (action.actionType) {
                case 'default': case 'spawn': case 'swap': case 'delay': case 'despawn':
                    handleConveyorAction(action as ConveyorAction);
                    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);
            // Consider adding error recovery or notification here
        }
    }, [
        handleConveyorAction,
        handleVehicleAction,
        handleRoboticArmAction,
        handleMachineAction,
        handleStorageAction
    ]);

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

    // Auto cleanup on unmount
    useEffect(() => {
        return () => {
            cleanup();
        };
    }, [cleanup]);

    return {
        handleAction,
        cleanup
    };
}