import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query' import type { Ref } from 'vue' import { apiClient } from '@/lib/axios' import type { ActivityLogEntry, AdminOrganisation, AdminOrganisationDetail, AdminUser, CreateOrganisationPayload, PlatformStats, UpdateAdminOrganisationPayload, UpdateAdminUserPayload, } from '@/types/admin' interface ApiResponse { success: boolean data: T message?: string } interface PaginatedResponse { data: T[] links: Record meta: { current_page: number per_page: number total: number last_page: number } } // ─── Organisations ────────────────────────────────────────── export function useAdminOrganisations(params: Ref>) { return useQuery({ queryKey: ['admin', 'organisations', params], queryFn: async () => { const { data } = await apiClient.get>( '/admin/organisations', { params: params.value }, ) return data }, }) } export function useAdminOrganisation(id: Ref) { return useQuery({ queryKey: ['admin', 'organisations', id], queryFn: async () => { const { data } = await apiClient.get>( `/admin/organisations/${id.value}`, ) return data.data }, enabled: () => !!id.value, }) } export function useUpdateAdminOrganisation() { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ id, payload }: { id: string; payload: UpdateAdminOrganisationPayload }) => { const { data } = await apiClient.put>( `/admin/organisations/${id}`, payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'organisations'] }) }, }) } export function useCreateOrganisation() { const queryClient = useQueryClient() return useMutation({ mutationFn: async (payload: CreateOrganisationPayload) => { const { data } = await apiClient.post>( '/organisations', payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'organisations'] }) }, }) } export function useDeleteAdminOrganisation() { const queryClient = useQueryClient() return useMutation({ mutationFn: async (id: string) => { await apiClient.delete(`/admin/organisations/${id}`) }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'organisations'] }) }, }) } // ─── Users ────────────────────────────────────────────────── export function useAdminUsers(params: Ref>) { return useQuery({ queryKey: ['admin', 'users', params], queryFn: async () => { const { data } = await apiClient.get>( '/admin/users', { params: params.value }, ) return data }, }) } export function useAdminUser(id: Ref) { return useQuery({ queryKey: ['admin', 'users', id], queryFn: async () => { const { data } = await apiClient.get>( `/admin/users/${id.value}`, ) return data.data }, enabled: () => !!id.value, }) } export function useUpdateAdminUser() { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ id, payload }: { id: string; payload: UpdateAdminUserPayload }) => { const { data } = await apiClient.put>( `/admin/users/${id}`, payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'users'] }) }, }) } export function useDeleteAdminUser() { const queryClient = useQueryClient() return useMutation({ mutationFn: async (id: string) => { await apiClient.delete(`/admin/users/${id}`) }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'users'] }) }, }) } // ─── Stats ────────────────────────────────────────────────── export function usePlatformStats() { return useQuery({ queryKey: ['admin', 'stats'], queryFn: async () => { const { data } = await apiClient.get<{ data: PlatformStats }>( '/admin/stats', ) return data.data }, }) } // ─── Activity Log ─────────────────────────────────────────── export function useAdminActivityLog(params: Ref>) { return useQuery({ queryKey: ['admin', 'activity-log', params], queryFn: async () => { const { data } = await apiClient.get>( '/admin/activity-log', { params: params.value }, ) return data }, }) } // ─── Impersonation ────────────────────────────────────────── // Impersonation API calls are now handled directly by useImpersonationStore.