import { useToast } from '@/lib/hooks/useToast'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import * as api from './api'
import { CreateStandardInput, PatchStandardInput } from './types'

// Ключи для React Query
export const standardsKeys = {
  all: ['standards'] as const,
  detail: (id: string) => ['standards', id] as const,
}

// Получить все эталоны
export const useStandards = () => {
  return useQuery({
    queryKey: standardsKeys.all,
    queryFn: api.getStandards,
    select: data => data.standards,
  })
}

// Получить один эталон
export const useStandard = (standardId: string) => {
  return useQuery({
    queryKey: standardsKeys.detail(standardId),
    queryFn: () => api.getStandard(standardId),
    select: data => data.standard,
    enabled: !!standardId,
  })
}

// Создать эталон
export const useCreateStandard = () => {
  const queryClient = useQueryClient()
  const { success, error } = useToast()

  return useMutation({
    mutationFn: (input: CreateStandardInput) => api.createStandard(input),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: standardsKeys.all })
      success('Эталон успешно создан')
    },
    onError: (err: Error) => {
      error(`Ошибка создания эталона: ${err.message}`)
    },
  })
}

// Обновить эталон
export const useUpdateStandard = () => {
  const queryClient = useQueryClient()
  const { success, error } = useToast()

  return useMutation({
    mutationFn: ({ id, input }: { id: string; input: PatchStandardInput }) =>
      api.patchStandard(id, input),
    onSuccess: (_, { id }) => {
      queryClient.invalidateQueries({ queryKey: standardsKeys.all })
      queryClient.invalidateQueries({ queryKey: standardsKeys.detail(id) })
      success('Эталон успешно обновлен')
    },
    onError: (err: Error) => {
      error(`Ошибка обновления эталона: ${err.message}`)
    },
  })
}

// Удалить эталон
export const useDeleteStandard = () => {
  const queryClient = useQueryClient()
  const { success, error } = useToast()

  return useMutation({
    mutationFn: (standardId: string) => api.deleteStandard(standardId),
    onSuccess: (_, standardId) => {
      queryClient.invalidateQueries({ queryKey: standardsKeys.all })
      queryClient.removeQueries({ queryKey: standardsKeys.detail(standardId) })
      success('Эталон успешно удален')
    },
    onError: (err: Error) => {
      error(`Ошибка удаления эталона: ${err.message}`)
    },
  })
}
