// User Admin React Query hooks

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { toast } from "react-hot-toast";
import { QUERY_KEYS as QUERY_KEY } from "../../../utils/query-key";
import {
  getUsers,
  getUser,
  searchUsers,
  createUser,
  updateUser,
  updateUserProfile,
  updateUserAvatar,
  deleteUser,
  verifyUser,
  unverifyUser,
  getUserStats,
} from "./_requests";
import {
  User,
  UserFilters,
  CreateUserRequest,
  UpdateUserRequest,
  UpdateUserProfileRequest,
  UpdateUserAvatarRequest,
  PaginatedUsersResponse,
} from "./_models";

// Get all users
export const useUsers = (filters?: UserFilters) => {
  return useQuery({
    queryKey: [QUERY_KEY.GET_USERS, filters],
    queryFn: () => getUsers(filters),
    staleTime: 5 * 60 * 1000, // 5 minutes
  });
};

// Get user by ID
export const useUser = (id: string) => {
  return useQuery({
    queryKey: [QUERY_KEY.GET_USER, id],
    queryFn: () => getUser(id),
    enabled: !!id,
    staleTime: 5 * 60 * 1000,
  });
};

// Search users with filters
export const useSearchUsers = (filters: UserFilters) => {
  return useQuery({
    queryKey: [QUERY_KEY.SEARCH_USERS, filters],
    queryFn: () => searchUsers(filters),
    enabled: Object.keys(filters).length > 0,
    staleTime: 2 * 60 * 1000, // 2 minutes for search results
  });
};

// Get user statistics
export const useUserStats = () => {
  return useQuery({
    queryKey: [QUERY_KEY.USER_STATS],
    queryFn: getUserStats,
    staleTime: 10 * 60 * 1000, // 10 minutes
  });
};

// Create user mutation
export const useCreateUser = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (userData: CreateUserRequest) => createUser(userData),
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] });
      toast.success("کاربر با موفقیت ایجاد شد");
    },
    onError: (error: any) => {
      const message = error?.response?.data?.message || "خطا در ایجاد کاربر";
      toast.error(message);
    },
  });
};

// Update user mutation
export const useUpdateUser = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({
      id,
      userData,
    }: {
      id: string;
      userData: UpdateUserRequest;
    }) => updateUser(id, userData),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({
        queryKey: [QUERY_KEY.GET_USER, variables.id],
      });
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] });
      toast.success("کاربر با موفقیت به‌روزرسانی شد");
    },
    onError: (error: any) => {
      const message =
        error?.response?.data?.message || "خطا در به‌روزرسانی کاربر";
      toast.error(message);
    },
  });
};

// Update user profile mutation
export const useUpdateUserProfile = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({
      id,
      userData,
    }: {
      id: string;
      userData: UpdateUserProfileRequest;
    }) => updateUserProfile(id, userData),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({
        queryKey: [QUERY_KEY.GET_USER, variables.id],
      });
      toast.success("پروفایل کاربر با موفقیت به‌روزرسانی شد");
    },
    onError: (error: any) => {
      const message =
        error?.response?.data?.message || "خطا در به‌روزرسانی پروفایل";
      toast.error(message);
    },
  });
};

// Update user avatar mutation
export const useUpdateUserAvatar = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: ({
      id,
      avatarData,
    }: {
      id: string;
      avatarData: UpdateUserAvatarRequest;
    }) => updateUserAvatar(id, avatarData),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({
        queryKey: [QUERY_KEY.GET_USER, variables.id],
      });
      toast.success("تصویر کاربر با موفقیت به‌روزرسانی شد");
    },
    onError: (error: any) => {
      const message =
        error?.response?.data?.message || "خطا در به‌روزرسانی تصویر";
      toast.error(message);
    },
  });
};

// Delete user mutation
export const useDeleteUser = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (id: string) => deleteUser(id),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.removeQueries({ queryKey: [QUERY_KEY.GET_USER, variables] });
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] });
      toast.success("کاربر با موفقیت حذف شد");
    },
    onError: (error: any) => {
      const message = error?.response?.data?.message || "خطا در حذف کاربر";
      toast.error(message);
    },
  });
};

// Verify user mutation
export const useVerifyUser = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (id: string) => verifyUser(id),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({
        queryKey: [QUERY_KEY.GET_USER, variables],
      });
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] });
      toast.success("کاربر با موفقیت تأیید شد");
    },
    onError: (error: any) => {
      const message = error?.response?.data?.message || "خطا در تأیید کاربر";
      toast.error(message);
    },
  });
};

// Unverify user mutation
export const useUnverifyUser = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (id: string) => unverifyUser(id),
    onSuccess: (data, variables) => {
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.GET_USERS] });
      queryClient.invalidateQueries({
        queryKey: [QUERY_KEY.GET_USER, variables],
      });
      queryClient.invalidateQueries({ queryKey: [QUERY_KEY.USER_STATS] });
      toast.success("تأیید کاربر لغو شد");
    },
    onError: (error: any) => {
      const message =
        error?.response?.data?.message || "خطا در لغو تأیید کاربر";
      toast.error(message);
    },
  });
};
