'use client';

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import { useSelectedStoreId } from '@/lib/stores/store-context';
import type { EditReviewInput, NewReviewInput } from '@alqove/api-client';

export const REVIEW_KEYS = {
  my: (params: { page?: number }) => ['reviews', 'me', params.page ?? 1] as const,
  store: (storeId: string, params: { page?: number }) =>
    ['reviews', 'store', storeId, params.page ?? 1] as const,
  storeSummary: (storeId: string) => ['reviews', 'store-summary', storeId] as const,
  seller: (storeId: string | null, params: { page?: number }) => ['reviews', 'seller', storeId, params.page ?? 1] as const,
};

export function useMyReviews(params: { page?: number } = {}) {
  return useQuery({
    queryKey: REVIEW_KEYS.my(params),
    queryFn: () => api.reviews.myReviews({ page: params.page }),
    staleTime: 30_000,
  });
}

export function useStoreReviews(
  storeId: string | null | undefined,
  params: { page?: number } = {},
) {
  return useQuery({
    queryKey: storeId ? REVIEW_KEYS.store(storeId, params) : ['reviews', 'store', 'none'],
    queryFn: () => api.reviews.storeReviews(storeId!, { page: params.page }),
    enabled: Boolean(storeId),
    staleTime: 30_000,
  });
}

export function useStoreRatingSummary(storeId: string | null | undefined, seller = false) {
  return useQuery({
    queryKey: seller ? ['reviews', 'seller-summary', storeId] : storeId ? REVIEW_KEYS.storeSummary(storeId) : ['reviews', 'store-summary', 'none'],
    queryFn: () => seller ? api.reviews.sellerRatingSummary(storeId!) : api.reviews.storeRatingSummary(storeId!),
    enabled: Boolean(storeId),
    staleTime: 60_000,
  });
}

export function useSellerReviews(params: { page?: number } = {}) {
  const storeId = useSelectedStoreId();
  return useQuery({
    queryKey: REVIEW_KEYS.seller(storeId, params),
    queryFn: () => api.reviews.sellerReviews(storeId!, { page: params.page }),
    enabled: !!storeId,
    staleTime: 30_000,
  });
}

function invalidateReviewCaches(qc: ReturnType<typeof useQueryClient>) {
  qc.invalidateQueries({ queryKey: ['reviews', 'me'] });
  qc.invalidateQueries({ queryKey: ['reviews', 'store'] });
  qc.invalidateQueries({ queryKey: ['reviews', 'store-summary'] });
  qc.invalidateQueries({ queryKey: ['reviews', 'seller'] });
  qc.invalidateQueries({ queryKey: ['purchases'] });
}

export function useCreateReview(orderItemId: string) {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (input: NewReviewInput) => api.reviews.create(orderItemId, input),
    onSuccess: () => invalidateReviewCaches(qc),
  });
}

export function useUpdateReview() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({ reviewId, input }: { reviewId: string; input: EditReviewInput }) =>
      api.reviews.update(reviewId, input),
    onSuccess: () => invalidateReviewCaches(qc),
  });
}
