Source: hooks/useUsers.ts

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import {
  fetchUsers,
  createUser,
  deleteUser,
  updateUser,
  type CreateUserPayload,
  type User,
} from '../services/apiService'

/**
 * Hook de requête qui récupère la liste des utilisateurs depuis l'API.
 * Met en cache le résultat sous la clé `['users']`.
 *
 * @returns Une requête React Query contenant `data`, `isLoading`, `isError`, etc.
 */
export function useUsersQuery() {
  return useQuery<User[]>({
    queryKey: ['users'],
    queryFn: fetchUsers,
  })
}

/**
 * Hook de mutation pour créer un nouvel utilisateur.
 * Invalide le cache `['users']` après une création réussie.
 *
 * @returns Une mutation React Query contenant `mutate`, `isPending`, etc.
 */
export function useCreateUser() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (payload: CreateUserPayload) => createUser(payload),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['users'] })
    },
  })
}

/**
 * Hook de mutation pour supprimer un utilisateur par son identifiant.
 * Invalide le cache `['users']` après une suppression réussie.
 *
 * @returns Une mutation React Query contenant `mutate`, `isPending`, etc.
 */
export function useDeleteUser() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (id: number) => deleteUser(id),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['users'] })
    },
  })
}

/**
 * Hook de mutation pour mettre à jour un utilisateur existant.
 * Invalide le cache `['users']` après une mise à jour réussie.
 *
 * @returns Une mutation React Query contenant `mutate`, `isPending`, etc.
 */
export function useUpdateUser() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: ({ id, payload }: { id: number; payload: CreateUserPayload }) =>
      updateUser(id, payload),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['users'] })
    },
  })
}