
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;
};
