
// 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;
// };
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
        ? raw.avatarUrl.startsWith('http')
          ? 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)) {
      const formatted = formatUser(userData);
      localStorage.setItem('user', JSON.stringify(formatted));
      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 必须在 UserProvider 内使用');
  }
  return context;
};
