// import React, { createContext, useContext, useState, useEffect } from 'react';

// const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';

// export const UserContext = createContext();

// export const UserProvider = ({ children }) => {
//   const [user, setUser] = useState(null);
//   const [loading, setLoading] = useState(true);

//   // ✅ 标准化用户数据结构
//   const formatUser = (raw) => {
//     if (!raw) return null;
//     return {
//       userId: raw.userId || raw.id || null,
//       username: raw.username || '匿名用户',
//       avatarUrl: raw.avatarUrl ? `${avatarBaseUrl}${raw.avatarUrl}` : null,
//       ...raw, // 保留其它字段（如 email, level 等）
//     };
//   };

//   useEffect(() => {
//     const storedUser = localStorage.getItem('user');
//     if (storedUser) {
//       try {
//         const parsed = JSON.parse(storedUser);
//         setUser(formatUser(parsed));
//       } catch (err) {
//         console.error('本地用户信息解析失败:', err);
//         localStorage.removeItem('user');
//         setUser(null);
//       }
//     } else {
//       // 设置默认用户
//       const defaultUser = {
//         userId: 1,
//         username: '测试用户',
//         avatarUrl: null,
//       };
//       localStorage.setItem('user', JSON.stringify(defaultUser));
//       setUser(formatUser(defaultUser));
//     }
//     setLoading(false);
//   }, []);

//   const saveUser = (userData) => {
//     if (userData && (userData.userId || userData.id)) {
//       const formatted = formatUser(userData);
//       localStorage.setItem('user', JSON.stringify(userData)); // 原始数据存储
//       setUser(formatted); // 格式化后使用
//     } else {
//       console.error('无效的用户数据:', userData);
//     }
//   };

//   const logout = () => {
//     localStorage.removeItem('user');
//     setUser(null);
//   };

//   return (
//     <UserContext.Provider value={{ user, saveUser, logout, loading }}>
//       {children}
//     </UserContext.Provider>
//   );
// };

// export const useUser = () => {
//   const context = useContext(UserContext);
//   if (!context) {
//     throw new Error('useUser must be used within a UserProvider');
//   }
//   return context;
// };


import React, { createContext, useContext, useState, useEffect } from 'react';

const avatarBaseUrl = process.env.REACT_APP_AVATAR_BASE_URL || '';

export const UserContext = createContext();

export const UserProvider = ({ children }) => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  const formatUser = (raw) => {
    if (!raw) return null;
    return {
      userId: raw.userId || raw.id || null,
      username: raw.username || '匿名用户',
      avatarUrl: raw.avatarUrl ? `${avatarBaseUrl}${raw.avatarUrl}` : null,
      ...raw,
    };
  };

  useEffect(() => {
    const storedUser = localStorage.getItem('user');
    if (storedUser) {
      try {
        const parsed = JSON.parse(storedUser);
        setUser(formatUser(parsed));
      } catch (err) {
        console.error('本地用户信息解析失败:', err);
        localStorage.removeItem('user');
        setUser(null);
      }
    } else {
      // 可以默认不自动登录，退出就是空
      setUser(null);
    }
    setLoading(false);
  }, []);

  const saveUser = (userData) => {
    if (userData && (userData.userId || userData.id)) {
      localStorage.setItem('user', JSON.stringify(userData));
      setUser(formatUser(userData));
    } else {
      console.error('无效的用户数据:', userData);
    }
  };

  const logout = () => {
    localStorage.removeItem('user');
    setUser(null);
  };

  return (
    <UserContext.Provider value={{ user, saveUser, logout, loading }}>
      {children}
    </UserContext.Provider>
  );
};

export const useUser = () => {
  const context = useContext(UserContext);
  if (!context) {
    throw new Error('useUser 必须在 UserProvider 内使用');
  }
  return context;
};
