import React, { useEffect, useState } from 'react';
import axios from 'axios';
import './UserProfile.css';
import UserNav from './UserNav/UserNav'; // 导入 UserNav 组件
import Header from '../../components/Header';


const API_BASE = process.env.REACT_APP_API_BASE;

const UserProfile = () => {
  const [userProfile, setUserProfile] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  // 假设用户ID为1，实际应用中应通过认证信息获取
  const userId = 1;

  useEffect(() => {
    // 获取用户个人资料
    const fetchUserProfile = async () => {
      try {
        setLoading(true);
        const response = await axios.get(`${API_BASE}/echo/user/profile`, {
          params: { user_id: userId }
        });

        if (response.data.status === 'success') {
          setUserProfile(response.data);
        } else {
          setError('用户不存在');
        }
      } catch (err) {
        setError('请求失败，请稍后再试');
      } finally {
        setLoading(false);
      }
    };

    fetchUserProfile();
  }, [userId]);

  if (loading) {
    return <p>加载中...</p>;
  }

  if (error) {
    return <p className="error">{error}</p>;
  }

  return (
    <div className="user-profile-container">
      <Header /> {/* 引入 Header 组件 */}
    <div className="user-center">
      <div className="user-nav-container">
        <UserNav /> {/* 引入导航栏 */}
      </div>
      <div className="common-card">
      <div className="right-content">
        <div className="profile-header">
          <img
            src={userProfile.avatar_url}
            alt={userProfile.nickname}
            className="avatar"
          />
          <h1>{userProfile.nickname}</h1>
        </div>

        <div className="profile-details">
          {/* <h2>个人资料</h2> */}
          <p><strong>邮箱：</strong>{userProfile.email}</p>
          <p><strong>性别：</strong>{userProfile.gender}</p>
          <p><strong>个人简介：</strong>{userProfile.bio}</p>
          <p><strong>兴趣：</strong>{userProfile.interests.join(', ')}</p>
          <p><strong>等级：</strong>{userProfile.level}</p>
          <p><strong>经验：</strong>{userProfile.experience}</p>
          <p><strong>上传量：</strong>{userProfile.upload_amount}</p>
          <p><strong>下载量：</strong>{userProfile.download_amount}</p>
          <p><strong>分享率：</strong>{(userProfile.share_rate * 100).toFixed(2)}%</p>
          <p><strong>VIP：</strong>{userProfile.is_vip ? '是' : '否'}</p>
          {userProfile.is_vip && <p><strong>VIP等级：</strong>{userProfile.vip_type}</p>}
          <p><strong>加入时间：</strong>{new Date(userProfile.joined_date).toLocaleDateString()}</p>
        </div>
      </div>
      </div>
      </div>
    </div>
  );
};

export default UserProfile;    
