import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { commonCodeApi } from "@/lib/api/commonCode";
import { queryKeys } from "@/lib/queryKeys";
import type { CategoryFilter, CreateCategoryData, UpdateCategoryData } from "@/lib/schemas/commonCode";

/**
 * 카테고리 목록 조회 훅
 */
export function useCategories(filters?: CategoryFilter) {
  return useQuery({
    queryKey: queryKeys.categories.list(filters),
    queryFn: () => commonCodeApi.categories.getList(filters),
    select: (data) => data.data || [],
  });
}

/**
 * 카테고리 생성 뮤테이션 훅
 */
export function useCreateCategory() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (data: CreateCategoryData) => commonCodeApi.categories.create(data),
    onSuccess: () => {
      // 모든 카테고리 쿼리 무효화
      queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
    },
    onError: (error) => {
      console.error("카테고리 생성 실패:", error);
    },
  });
}

/**
 * 카테고리 수정 뮤테이션 훅
 */
export function useUpdateCategory() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({ categoryCode, data }: { categoryCode: string; data: UpdateCategoryData }) =>
      commonCodeApi.categories.update(categoryCode, data),
    onSuccess: (_, variables) => {
      // 해당 카테고리 상세 쿼리 무효화
      queryClient.invalidateQueries({
        queryKey: queryKeys.categories.detail(variables.categoryCode),
      });
      // 모든 카테고리 관련 쿼리 무효화 (일반 목록 + 무한 스크롤)
      queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
    },
    onError: (error) => {
      console.error("카테고리 수정 실패:", error);
    },
  });
}

/**
 * 카테고리 삭제 뮤테이션 훅
 */
export function useDeleteCategory() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (categoryCode: string) => commonCodeApi.categories.delete(categoryCode),
    onSuccess: (_, categoryCode) => {
      // 해당 카테고리와 관련된 모든 쿼리 무효화
      queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
      queryClient.invalidateQueries({ queryKey: queryKeys.codes.all });

      // 해당 카테고리의 캐시 제거
      queryClient.removeQueries({ queryKey: queryKeys.categories.detail(categoryCode) });
    },
    onError: (error) => {
      console.error("카테고리 삭제 실패:", error);
    },
  });
}
