'use client';

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import type {
  CreateReviewReportInput,
  HideReviewInput,
  ResolveReviewReportInput,
  RestoreReviewInput,
  ReviewReportState,
} from '@alqove/api-client';

type AdminListState = ReviewReportState | 'all';
type AdminStoreReviewsState = 'visible' | 'hidden' | 'all';

export const REVIEW_REPORT_KEYS = {
  adminList: (params: { state?: AdminListState; page?: number }) =>
    ['review-reports', 'admin', params.state ?? 'open', params.page ?? 1] as const,
  adminStoreReviews: (
    storeId: string,
    params: { state?: AdminStoreReviewsState; page?: number },
  ) =>
    [
      'admin',
      'stores',
      storeId,
      'reviews',
      params.state ?? 'all',
      params.page ?? 1,
    ] as const,
};

function invalidateAfterReportResolution(qc: ReturnType<typeof useQueryClient>) {
  qc.invalidateQueries({ queryKey: ['review-reports', 'admin'] });
  qc.invalidateQueries({ queryKey: ['admin', 'stores'] });
  qc.invalidateQueries({ queryKey: ['reviews'] });
}

function invalidateAfterModeration(qc: ReturnType<typeof useQueryClient>) {
  qc.invalidateQueries({ queryKey: ['reviews'] });
  qc.invalidateQueries({ queryKey: ['review-reports', 'admin'] });
  qc.invalidateQueries({ queryKey: ['admin', 'stores'] });
}

export function useReportReview() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({ reviewId, input }: { reviewId: string; input: CreateReviewReportInput }) =>
      api.reviewReports.report(reviewId, input),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: ['reviews'] });
    },
  });
}

export function useAdminReviewReports(
  params: { state?: AdminListState; page?: number } = {},
) {
  return useQuery({
    queryKey: REVIEW_REPORT_KEYS.adminList(params),
    queryFn: () =>
      api.admin.reviewReports.list({
        state: params.state ?? 'open',
        page: params.page,
      }),
    staleTime: 30_000,
  });
}

export function useAdminResolveReviewReport() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({
      reportId,
      input,
    }: {
      reportId: string;
      input: ResolveReviewReportInput;
    }) => api.admin.reviewReports.resolve(reportId, input),
    onSuccess: () => invalidateAfterReportResolution(qc),
  });
}

export function useAdminHideReview() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({ reviewId, input }: { reviewId: string; input: HideReviewInput }) =>
      api.admin.reviewReports.hideReview(reviewId, input),
    onSuccess: () => invalidateAfterModeration(qc),
  });
}

export function useAdminRestoreReview() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({ reviewId, input }: { reviewId: string; input: RestoreReviewInput }) =>
      api.admin.reviewReports.restoreReview(reviewId, input),
    onSuccess: () => invalidateAfterModeration(qc),
  });
}

export function useAdminStoreReviews(
  storeId: string | null,
  params: { state?: AdminStoreReviewsState; page?: number } = {},
) {
  return useQuery({
    queryKey: storeId
      ? REVIEW_REPORT_KEYS.adminStoreReviews(storeId, params)
      : ['admin', 'stores', 'none', 'reviews'],
    queryFn: () =>
      api.admin.reviewReports.storeReviews(storeId!, {
        state: params.state ?? 'all',
        page: params.page,
      }),
    enabled: Boolean(storeId),
    staleTime: 30_000,
  });
}
