import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { {{ENTITY_LOWER}}Service } from '@/services/{{ENTITY_LOWER}}';
import type { {{ENTITY}}, Create{{ENTITY}}Request } from '@/types';

/**
 * Hook to fetch a {{ENTITY_LOWER}} by ID
 * 
 * @param {{ENTITY_LOWER}}Id - The ID of the {{ENTITY_LOWER}} to fetch
 * @returns Query result with {{ENTITY_LOWER}} data
 * 
 * @example
 * ```tsx
 * const { data: {{ENTITY_LOWER}}, isLoading, error } = use{{ENTITY}}('123');
 * ```
 */
export function use{{ENTITY}}({{ENTITY_LOWER}}Id: string) {
  return useQuery({
    queryKey: ['{{ENTITY_LOWER}}', {{ENTITY_LOWER}}Id],
    queryFn: () => {{ENTITY_LOWER}}Service.get{{ENTITY}}({{ENTITY_LOWER}}Id),
    enabled: !!{{ENTITY_LOWER}}Id,
    staleTime: 5 * 60 * 1000, // 5 minutes
  });
}

/**
 * Hook to create a new {{ENTITY_LOWER}}
 * 
 * @returns Mutation function to create {{ENTITY_LOWER}}
 * 
 * @example
 * ```tsx
 * const create{{ENTITY}} = useCreate{{ENTITY}}();
 * 
 * const handleCreate = async () => {
 *   await create{{ENTITY}}.mutateAsync({
 *     // ... request data
 *   });
 * };
 * ```
 */
export function useCreate{{ENTITY}}() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (request: Create{{ENTITY}}Request) =>
      {{ENTITY_LOWER}}Service.create{{ENTITY}}(request),
    onSuccess: () => {
      // Invalidate and refetch {{ENTITY_LOWER}} list
      queryClient.invalidateQueries({ queryKey: ['{{ENTITY_LOWER}}s'] });
    },
  });
}

/**
 * Hook to update a {{ENTITY_LOWER}}
 * 
 * @returns Mutation function to update {{ENTITY_LOWER}}
 */
export function useUpdate{{ENTITY}}() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({ id, data }: { id: string; data: Partial<{{ENTITY}}> }) =>
      {{ENTITY_LOWER}}Service.update{{ENTITY}}(id, data),
    onSuccess: (_, variables) => {
      // Invalidate specific {{ENTITY_LOWER}} and list
      queryClient.invalidateQueries({ queryKey: ['{{ENTITY_LOWER}}', variables.id] });
      queryClient.invalidateQueries({ queryKey: ['{{ENTITY_LOWER}}s'] });
    },
  });
}

/**
 * Hook to delete a {{ENTITY_LOWER}}
 * 
 * @returns Mutation function to delete {{ENTITY_LOWER}}
 */
export function useDelete{{ENTITY}}() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (id: string) => {{ENTITY_LOWER}}Service.delete{{ENTITY}}(id),
    onSuccess: () => {
      // Invalidate {{ENTITY_LOWER}} list
      queryClient.invalidateQueries({ queryKey: ['{{ENTITY_LOWER}}s'] });
    },
  });
}







