import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { deleteC2Config, executeC2, getC2Config, listCallbacks, putC2Config, testC2Config, } from '@/api/c2'; import type { C2ConfigInput, C2ExecuteInput } from '@/api/types'; function c2ConfigKey(engagementId: number) { return ['c2-config', engagementId] as const; } function c2CallbacksKey(engagementId: number) { return ['c2-callbacks', engagementId] as const; } function simulationKey(id: number) { return ['simulations', id] as const; } export function useC2Config(engagementId: number | undefined, options?: { enabled?: boolean }) { const enabled = typeof engagementId === 'number' && !Number.isNaN(engagementId) && (options?.enabled !== false); return useQuery({ queryKey: engagementId ? c2ConfigKey(engagementId) : ['c2-config', 'none'], queryFn: () => getC2Config(engagementId as number), enabled, }); } export function useUpdateC2Config(engagementId: number) { const qc = useQueryClient(); return useMutation({ mutationFn: (input: C2ConfigInput) => putC2Config(engagementId, input), onSuccess: () => qc.invalidateQueries({ queryKey: c2ConfigKey(engagementId) }), }); } export function useDeleteC2Config(engagementId: number) { const qc = useQueryClient(); return useMutation({ mutationFn: () => deleteC2Config(engagementId), onSuccess: () => qc.invalidateQueries({ queryKey: c2ConfigKey(engagementId) }), }); } export function useTestC2Config(engagementId: number) { return useMutation({ mutationFn: () => testC2Config(engagementId), }); } export function useC2Callbacks(engagementId: number | undefined, options?: { enabled?: boolean }) { const enabled = typeof engagementId === 'number' && !Number.isNaN(engagementId) && (options?.enabled !== false); return useQuery({ queryKey: engagementId ? c2CallbacksKey(engagementId) : ['c2-callbacks', 'none'], queryFn: () => listCallbacks(engagementId as number), enabled, }); } export function useExecuteC2(simulationId: number, engagementId: number) { const qc = useQueryClient(); return useMutation({ mutationFn: (input: C2ExecuteInput) => executeC2(simulationId, input), onSuccess: () => { qc.invalidateQueries({ queryKey: simulationKey(simulationId) }); qc.invalidateQueries({ queryKey: ['engagements', engagementId, 'simulations'] }); }, }); }