import { useMutation, useQueryClient } from "@tanstack/react-query";
import { ApiResponse } from "@/types/api-response";
import { authService } from "./service";
import { LoginDto, RegisterDto, RefreshTokenDto, AuthResponse } from "./types";

export const AuthQueryKeys = {
  all: ["auth"] as const,
  session: () => [...AuthQueryKeys.all, "session"] as const,
};

export function useLogin() {
  const queryClient = useQueryClient();

  const { data, ...rest } = useMutation<
    ApiResponse<AuthResponse>,
    Error,
    LoginDto
  >({
    mutationFn: (credentials: LoginDto) => authService.login(credentials),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: AuthQueryKeys.session() });
    },
  });

  return { data: data?.data, ...rest };
}

export function useRegister() {
  const { data, ...rest } = useMutation<
    ApiResponse<AuthResponse>,
    Error,
    RegisterDto
  >({
    mutationFn: (userData: RegisterDto) => authService.register(userData),
  });

  return { data: data?.data, ...rest };
}

export function useRefreshToken() {
  const { data, ...rest } = useMutation<
    ApiResponse<AuthResponse>,
    Error,
    RefreshTokenDto
  >({
    mutationFn: (tokenData: RefreshTokenDto) =>
      authService.refreshToken(tokenData),
  });

  return { data: data?.data, ...rest };
}

export function useLogout() {
  const queryClient = useQueryClient();

  const { data, ...rest } = useMutation<ApiResponse<null>, Error, void>({
    mutationFn: () => authService.logout(),
    onSuccess: () => {
      queryClient.clear();
    },
  });

  return { data: data?.data, ...rest };
}
