import {
  createSheet,
  getSheetsByTemplate,
  patchSheet,
  type ApiSheet,
  type GetSheetsOutput,
  type PatchSheetInput,
} from '@/service/sheetApiService'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'

// Ключи для React Query
export const sheetKeys = {
  all: ['sheets'] as const,
  byTemplate: (templateId: string) =>
    [...sheetKeys.all, 'template', templateId] as const,
  detail: (sheetId: string) => [...sheetKeys.all, 'detail', sheetId] as const,
}

// Хук для получения листов по template_id с кешированием
export function useSheetsByTemplate(templateId: string | undefined) {
  return useQuery({
    queryKey: sheetKeys.byTemplate(templateId || ''),
    queryFn: () => getSheetsByTemplate(templateId!),
    enabled: !!templateId,
    staleTime: 1 * 60 * 1000, // 1 минута для активных данных
    gcTime: 5 * 60 * 1000, // 5 минут кеш
    refetchOnWindowFocus: false, // Не перезапрашивать при фокусе окна
  })
}

// Хук для создания листа
export function useCreateSheet() {
  const queryClient = useQueryClient()

  return useMutation({
    mutationFn: createSheet,
    onSuccess: (data, variables) => {
      // Инвалидируем кеши после создания листа
      queryClient.invalidateQueries({
        queryKey: sheetKeys.byTemplate(variables.template_id),
      })
      queryClient.invalidateQueries({
        queryKey: sheetKeys.all,
      })

      // Добавляем новый лист в кеш списка листов для шаблона
      queryClient.setQueryData<GetSheetsOutput>(
        sheetKeys.byTemplate(variables.template_id),
        oldData => {
          if (!oldData) return { sheets: [] }

          const newSheet: ApiSheet = {
            id: data.id,
            name: variables.name,
            cells: variables.cells,
            template_id: variables.template_id,
            created_at: new Date().toISOString(),
            updated_at: new Date().toISOString(),
          }

          return {
            sheets: [...oldData.sheets, newSheet],
          }
        }
      )
    },
  })
}

// Хук для обновления листа
export function usePatchSheet() {
  const queryClient = useQueryClient()

  return useMutation({
    mutationFn: ({
      sheetId,
      data,
    }: {
      sheetId: string
      data: PatchSheetInput
    }) => patchSheet(sheetId, data),
    onSuccess: (result, variables) => {
      // Обновляем конкретный лист в кеше
      queryClient.setQueryData(
        sheetKeys.detail(variables.sheetId),
        (oldData: any) => {
          if (!oldData?.sheet) return oldData

          return {
            sheet: {
              ...oldData.sheet,
              ...variables.data,
              updated_at: new Date().toISOString(),
            },
          }
        }
      )

      // Обновляем лист в списке листов для шаблона
      const sheetDetail = queryClient.getQueryData(
        sheetKeys.detail(variables.sheetId)
      ) as any
      const templateId = sheetDetail?.sheet?.template_id

      if (templateId) {
        queryClient.setQueryData<GetSheetsOutput>(
          sheetKeys.byTemplate(templateId),
          oldData => {
            if (!oldData) return oldData

            return {
              sheets: oldData.sheets.map(sheet =>
                sheet.id === variables.sheetId
                  ? {
                      ...sheet,
                      name: variables.data.name || sheet.name,
                      cells: variables.data.cells || sheet.cells,
                      updated_at: new Date().toISOString(),
                    }
                  : sheet
              ),
            }
          }
        )
      }
    },
  })
}
