/**
 * 认证相关 Hooks
 */
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useNavigate } from "react-router-dom";
import * as authApi from "@/api/auth";
import { useAuthStore } from "@/store/authStore";

// 登录 Hook
export const useLogin = () => {
  const navigate = useNavigate();
  const setAuth = useAuthStore((state) => state.setAuth);

  const mutation = useMutation({
    mutationFn: authApi.login,
  });

  // 手动处理成功后的逻辑
  const login = async (credentials: Parameters<typeof authApi.login>[0]) => {
    const data = await mutation.mutateAsync(credentials);
    const refreshToken = data.refresh_token ?? null;

    // 先保存 token
    localStorage.setItem("access_token", data.access_token);
    if (refreshToken) {
      localStorage.setItem("refresh_token", refreshToken);
    } else {
      localStorage.removeItem("refresh_token");
    }

    // 获取用户信息
    const user = await authApi.getCurrentUser();
    setAuth(user, data.access_token, refreshToken);
    navigate("/");
    return data;
  };

  return { ...mutation, mutateAsync: login };
};

// 注册 Hook
export const useRegister = () => {
  const navigate = useNavigate();

  const mutation = useMutation({
    mutationFn: authApi.register,
  });

  const register = async (data: Parameters<typeof authApi.register>[0]) => {
    const result = await mutation.mutateAsync(data);
    navigate("/login", {
      state: { message: "注册成功！请查收验证邮件。" },
    });
    return result;
  };

  return { ...mutation, mutateAsync: register };
};

// 登出 Hook
export const useLogout = () => {
  const navigate = useNavigate();
  const clearAuth = useAuthStore((state) => state.clearAuth);
  const queryClient = useQueryClient();

  const mutation = useMutation({
    mutationFn: authApi.logout,
  });

  const logout = async () => {
    try {
      await mutation.mutateAsync();
    } catch (error) {
      // 即使登出失败也清除本地状态
    } finally {
      clearAuth();
      queryClient.clear();
      navigate("/");
    }
  };

  return { ...mutation, mutateAsync: logout };
};

// 获取当前用户 Hook
export const useCurrentUser = () => {
  const isAuthenticated = useAuthStore((state) => state.isAuthenticated);

  return useQuery({
    queryKey: ["currentUser"],
    queryFn: authApi.getCurrentUser,
    enabled: isAuthenticated,
  });
};
