/**
 * 认证上下文 - 全局状态管理
 * 管理用户登录状态、认证信息等全局状态
 * 
 * 【重要说明】：
 * 1. 使用React Context API进行全局状态管理
 * 2. 提供登录、登出、用户信息管理等功能
 * 3. 与后端API紧密集成，调用认证相关接口
 * 4. 自动处理token存储和清理
 */

import React, { createContext, useContext, useState, useEffect } from 'react';
import { message } from 'antd';
import { 
  loginUser, 
  registerUser, 
  logoutUser, 
  formatApiError 
} from '../api/auth';

// 创建认证上下文
const AuthContext = createContext();

/**
 * 认证提供者组件
 * 包装整个应用，提供认证相关的状态和方法
 */
export const AuthProvider = ({ children }) => {
  // 用户状态
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  const [isAuthenticated, setIsAuthenticated] = useState(false);

  // 初始化时检查用户登录状态
  useEffect(() => {
    initializeAuth();
  }, []); // eslint-disable-line react-hooks/exhaustive-deps

  /**
   * 初始化认证状态
   * 检查本地存储的token是否有效
   */
  const initializeAuth = async () => {
    try {
      const token = localStorage.getItem('authToken');
      const userInfo = localStorage.getItem('userInfo');

      if (token && userInfo) {
        // 验证token有效性
        const userData = JSON.parse(userInfo);
        setUser(userData);
        setIsAuthenticated(true);
        
        // 【API调用标注】验证用户信息
        // 这里可以调用后端验证token的有效性
        // const response = await getUserInfo(userData.id);
        // if (!response.success) {
        //   throw new Error('Token无效');
        // }
      }
    } catch (error) {
      console.error('初始化认证状态失败:', error);
      clearAuth();
    } finally {
      setLoading(false);
    }
  };

  /**
   * 用户登录
   * 【API调用标注】调用后端登录接口
   */
  const login = async (credentials) => {
    try {
      setLoading(true);
      
      // 【API调用标注】调用后端登录接口
      // 后端接口: POST /auth/login
      // 对应后端文件: backend/api/auth_api.py -> login()
      const response = await loginUser(credentials);
      
      if (response.success) {
        // 保存认证信息到本地存储
        localStorage.setItem('authToken', response.token);
        localStorage.setItem('userInfo', JSON.stringify(response.user));
        
        // 更新状态
        setUser(response.user);
        setIsAuthenticated(true);
        
        message.success('登录成功！');
        return { success: true };
      } else {
        message.error(response.error || '登录失败');
        return { success: false, error: response.error };
      }
    } catch (error) {
      const errorMessage = formatApiError(error);
      message.error(errorMessage);
      return { success: false, error: errorMessage };
    } finally {
      setLoading(false);
    }
  };

  /**
   * 用户注册
   * 【API调用标注】调用后端注册接口
   */
  const register = async (userData) => {
    try {
      setLoading(true);
      
      // 【API调用标注】调用后端注册接口
      // 后端接口: POST /auth/register
      // 对应后端文件: backend/api/auth_api.py -> register()
      const response = await registerUser(userData);
      
      if (response.success) {
        message.success('注册成功！请登录');
        return { success: true };
      } else {
        message.error(response.error || '注册失败');
        return { success: false, error: response.error };
      }
    } catch (error) {
      const errorMessage = formatApiError(error);
      message.error(errorMessage);
      return { success: false, error: errorMessage };
    } finally {
      setLoading(false);
    }
  };

  /**
   * 用户登出
   * 【API调用标注】调用后端登出接口
   */
  const logout = async () => {
    try {
      const token = localStorage.getItem('authToken');
      
      if (token) {
        // 【API调用标注】调用后端登出接口
        // 后端接口: POST /auth/logout
        // 对应后端文件: backend/api/auth_api.py -> logout()
        await logoutUser(token);
      }
    } catch (error) {
      console.error('登出API调用失败:', error);
    } finally {
      // 无论API调用是否成功，都清除本地状态
      clearAuth();
      message.success('已退出登录');
    }
  };

  /**
   * 清除认证信息
   */
  const clearAuth = () => {
    localStorage.removeItem('authToken');
    localStorage.removeItem('userInfo');
    setUser(null);
    setIsAuthenticated(false);
  };

  /**
   * 更新用户信息
   */
  const updateUser = (userData) => {
    setUser(userData);
    localStorage.setItem('userInfo', JSON.stringify(userData));
  };

  // 提供上下文值
  const contextValue = {
    user,
    loading,
    isAuthenticated,
    login,
    register,
    logout,
    updateUser,
  };

  return (
    <AuthContext.Provider value={contextValue}>
      {children}
    </AuthContext.Provider>
  );
};

/**
 * 使用认证上下文的Hook
 * 在组件中使用此Hook获取认证相关的状态和方法
 */
export const useAuth = () => {
  const context = useContext(AuthContext);
  if (!context) {
    throw new Error('useAuth必须在AuthProvider内部使用');
  }
  return context;
};

export default AuthContext; 