import React, { useState, useEffect, Profiler } from 'react';
import { 
  Box, 
  Grid, 
  Typography, 
  Avatar, 
  Button, 
  Tabs, 
  Tab, 
  Card, 
  CardMedia, 
  CardContent, 
  CardActions, 
  IconButton, 
  Divider,
  List,
  ListItem,
  ListItemAvatar,
  ListItemText,
  TextField,
  InputAdornment,
  Chip,
  Badge,
  Fab,
  Paper,
  MenuItem,
  Container,
  useMediaQuery,
  useTheme,
  CircularProgress,
  Snackbar,
  Alert,
  Menu,
  Pagination,
  Stack
} from '@mui/material';
import { useParams } from 'react-router-dom';
import { 
  CameraAlt, 
  Edit, 
  Favorite, 
  Share, 
  MoreVert, 
  LocationOn, 
  Cake, 
  Female, 
  Male, 
  Public, 
  Add,
  Search,
  Notifications,
  Person,
  Collections,
  ChevronLeft,
  ChevronRight,
  Close,
  Bookmark,
  Group,
  People
} from '@mui/icons-material';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { Link, useNavigate } from 'react-router-dom';

// 导入API服务
import { 
  getCurrentUser, 
  getUser, 
  updateUser as updateUserApi,
  followUser as followUserApi,
  unfollowUser as unfollowUserApi,
  getUserPosts,
  getUserInteractions,
  getUserFollowers,
  getFavorites,
  getUserFollowing
} from '../api/api_ljc';
import { fetchPost } from '../api/posts_wzy';

// 创建小红书主题
const theme = createTheme({
  palette: {
    primary: {
      main: '#ff4081',
    },
    secondary: {
      main: '#f50057',
    },
    background: {
      default: '#f5f5f5',
    },
  },
  typography: {
    fontFamily: '"PingFang SC", "Helvetica Neue", Arial, sans-serif',
    h5: {
      fontWeight: 600,
    },
    subtitle1: {
      color: 'rgba(0, 0, 0, 0.6)',
    },
  },
  components: {
    MuiButton: {
      styleOverrides: {
        root: {
          borderRadius: 20,
          textTransform: 'none',
          fontWeight: 500,
        },
      },
    },
    MuiCard: {
      styleOverrides: {
        root: {
          borderRadius: 16,
        },
      },
    },
  },
});

const UserProfile = () => {
  const { userId } = useParams();
  const theme = useTheme();
  const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
  const navigate = useNavigate();
  const [activeTab, setActiveTab] = useState(0);
  const [isEditing, setIsEditing] = useState(false);
  const [favorites, setFavorites] = useState([]);
  const [following, setFollowing] = useState([]);
  const [followers, setFollowers] = useState([]);
  const [follower, setFollower] = useState([]);
  const [snackbar, setSnackbar] = useState({ open: false, message: '', severity: 'success' });
  const [anchorEl, setAnchorEl] = useState(null);
  
  // 用户数据状态
  const [currentUser, setCurrentUser] = useState(null);
  const [profileUser, setProfileUser] = useState(null);
  const [posts, setPosts] = useState([]);
  const [allPosts, setAllPosts] = useState([]); // 存储所有帖子数据
  const [interactions, setInteractions] = useState({ 
    likes_count: 0, 
    favorites_count: 0 
  });
  
  // 分页状态
  const [currentPage, setCurrentPage] = useState(1);
  const [postsPerPage] = useState(8); // 每页显示8个帖子
  const [totalPages, setTotalPages] = useState(0);
  
  // 加载状态
  const [loading, setLoading] = useState(true);
  const [updating, setUpdating] = useState(false);
  const [tabLoading, setTabLoading] = useState(false);
  
  // 表单状态
  const [formData, setFormData] = useState({
    avatar: '',
    bio: '',
    gender: '',
    birthday: '',
    location: ''
  });

  const menuOpen = Boolean(anchorEl);

  // 显示提示信息
  const showSnackbar = (message, severity = 'success') => {
    setSnackbar({ open: true, message, severity });
  };

  // 分页处理函数
  const updatePaginatedPosts = (page, allPostsData) => {
    const startIndex = (page - 1) * postsPerPage;
    const endIndex = startIndex + postsPerPage;
    const paginatedPosts = allPostsData.slice(startIndex, endIndex);
    setPosts(paginatedPosts);
    setTotalPages(Math.ceil(allPostsData.length / postsPerPage));
  };

  const handlePageChange = (newPage) => {
    if (newPage >= 1 && newPage <= totalPages) {
      setCurrentPage(newPage);
      updatePaginatedPosts(newPage, allPosts);
    }
  };

  const handlePrevPage = () => {
    handlePageChange(currentPage - 1);
  };

  const handleNextPage = () => {
    handlePageChange(currentPage + 1);
  };

  // 加载用户数据
  useEffect(() => {
    const fetchInteractions = async () => {
    try {
      const response = await getUserInteractions(userId);
      if (response.data.success) {
        setInteractions(response.data.data);
      } else {
        console.error(response.data.error);
      }
    } catch (error) {
      console.error('获取互动数据失败:', error);
    }
  };
  
  fetchInteractions();

   
    const fetchData = async () => {
      try {
        setLoading(true);
        
        // 获取当前登录用户
        const currentUserRes = await getUser(userId);
        setCurrentUser(currentUserRes.data);
        
        // 获取目标用户信息
        console.log('userId', userId)
        const profileUserRes = await getUser(userId);
        setProfileUser(profileUserRes.data);
        setFormData({
          avatar: profileUserRes.data.avatar || '',
          bio: profileUserRes.data.bio || '',
          gender: profileUserRes.data.gender || '',
          birthday: profileUserRes.data.birthday || '',
          location: profileUserRes.data.location || ''
        });

        if (activeTab === 1) {
                  // 加载收藏数据
                  const favoritesRes = await getFavorites(userId);
                  setFavorites(favoritesRes.data);
                } else if (activeTab === 2) {
                  // 加载关注列表
                  const followingRes = await getUserFollowing(userId);
                  setFollowing(followingRes.data);
                  console.log("following",followingRes.data)
                }  else if (activeTab === 3) {
                  // 加载粉丝列表
                  const followersRes = await getUserFollowers(userId);
                  // 
                  setFollowers(followersRes.data.data);
                }
        
        // 获取用户帖子
        const postsRes = await getUserPosts(userId);
        
        // 为了拿到 media_urls，这里需要拉取每个帖子的详情
        const postsWithDetails = await Promise.all(
          postsRes.data.map(async post => {
            try {
              const detail = await fetchPost(post.id);
              return {
                ...post,
                media_urls: detail.media_urls || [],
                user_id: detail.user_id
              };
            } catch (error) {
              console.error(`获取帖子 ${post.id} 详情失败:`, error);
              return {
                ...post,
                media_urls: [],
                user_id: null
              };
            }
          })
        );
        
        setAllPosts(postsWithDetails); // 存储所有帖子
        updatePaginatedPosts(1, postsWithDetails); // 初始化第一页数据
        setCurrentPage(1); // 重置到第一页
        
        // 获取用户互动数据（获赞和收藏数量）
        const interactionsRes = await getUserInteractions(userId);
        setInteractions(interactionsRes.data);
        
      } catch (error) {
        console.error('获取用户数据失败:', error);
        showSnackbar('获取用户数据失败，请重试', 'error');
      } finally {
        setLoading(false);
      }
    };
    
    fetchData();
  }, [activeTab,userId]);

  // 根据标签页加载数据
  useEffect(() => {
    // 由于只有笔记标签页，不需要根据activeTab加载不同数据
  }, [activeTab, userId, profileUser]);

  const handleTabChange = (event, newValue) => {
    // 由于只有一个标签页，不需要切换逻辑
    setActiveTab(newValue);
  };

  const handleFollowToggle = async () => {
    if (!currentUser || !profileUser) return;
    try {
      if (profileUser.is_following) {
        await unfollowUserApi(profileUser.id);
        showSnackbar('已取消关注');
      } else {
        await followUserApi(profileUser.id);
        showSnackbar('关注成功');
      }
      // 更新用户信息
      const updatedUser = await getUser(userId);
      setProfileUser(updatedUser.data);
    } catch (error) {
      console.error('关注操作失败:', error);
      showSnackbar('操作失败，请重试', 'error');
    }
  };

  const handleFollowUser = async (userId,followeeId) => {
    try {
      await followUserApi(userId,followeeId);
      showSnackbar('关注成功');
      
      // 更新粉丝列表中的关注状态
    setFollowers(prevFollowers => 
      prevFollowers.map(follower => 
        follower.id === followeeId 
          ? { ...follower, is_following: true } 
          : follower
      )
    );
    
    // 更新当前用户的关注数
    if (currentUser) {
      setCurrentUser(prev => ({
        ...prev,
        following_count: prev.following_count + 1
      }));
    }
    
    // 如果被关注的用户是当前用户的粉丝，更新粉丝数
    setFollowers(prevFollowers => 
      prevFollowers.map(follower => 
        follower.id === followeeId 
          ? { 
              ...follower, 
              followers_count: follower.followers_count + 1 
            } 
          : follower
      )
    );
    
      
    } catch (error) {
      console.error('关注操作失败:', error);
      showSnackbar('关注失败，请重试', 'error');
    }
  };

  const handleUnfollow = async (userId,followeeId, e) => {
    // e.stopPropagation(); // 阻止事件冒泡
    
    try {
      await unfollowUserApi(userId,followeeId);
      showSnackbar('已取消关注');
      
      // 更新关注列表 - 移除取消关注的用户
    setFollowing(prevFollowing => 
      prevFollowing.filter(user => user.id !== followeeId)
    );
    
    // 更新粉丝列表 - 更新关注状态
    setFollowers(prevFollowers => 
      prevFollowers.map(follower => 
        follower.id === followeeId 
          ? { ...follower, is_following: false } 
          : follower
      )
    );
      
      // 更新当前用户关注数
      if (currentUser) {
        setCurrentUser(prev => ({
          ...prev,
          following_count: prev.following_count - 1
        }));
      }
      
      // 更新目标用户粉丝数
      setProfileUser(prev => ({
        ...prev,
        followers_count: prev.followers_count - 1
      }));
      
    } catch (error) {
      console.error('取消关注失败:', error);
      showSnackbar('操作失败，请重试', 'error');
    }
  };

  const handleFormChange = (e) => {
    const { name, value } = e.target;
    setFormData({ ...formData, [name]: value });
  };

  const handleUpdateProfile = async () => {
    if (!profileUser) return;
    
    try {
      setUpdating(true);
      const data = { 
        avatar: formData.avatar,
        bio: formData.bio,
        gender: formData.gender,
        birthday: formData.birthday,
        location: formData.location
      };
      
      // 调用更新API
      const updatedUser = await updateUserApi(profileUser.id, data);
      
      // 更新本地状态
      setProfileUser({ ...profileUser, ...updatedUser.data });
      setFormData({ ...formData, ...data });
      

      showSnackbar('个人资料更新成功');
      setIsEditing(false);
      
    } catch (error) {
      console.error('更新个人资料失败:', error);
      showSnackbar('更新失败，请重试', 'error');
    } finally {
      setUpdating(false);
    }
  };

  const navigateToUserProfile = (userId) => {
    navigate(`/user/${userId}`);
  };

  const handleMenuOpen = (e) => setAnchorEl(e.currentTarget);
  const handleMenuClose = () => setAnchorEl(null);
  const handleLogout = () => {
    handleMenuClose();
    // 清理本地存储中的token和用户信息
    localStorage.removeItem('token');
    localStorage.removeItem('user');
    localStorage.removeItem('userId');
    localStorage.clear();
    
    showSnackbar('已成功注销', 'success');
    
    // 跳转到首页
    navigate('/login');
  };

  if (loading) {
    return (
      <Box sx={{ 
        display: 'flex', 
        justifyContent: 'center', 
        alignItems: 'center', 
        height: '100vh' 
      }}>
        <CircularProgress size={60} />
      </Box>
    );
  }

  if (!profileUser) {
    return (
      <Box sx={{ 
        display: 'flex', 
        justifyContent: 'center', 
        alignItems: 'center', 
        height: '100vh',
        flexDirection: 'column'
      }}>
        <Typography variant="h6" sx={{ mb: 2 }}>用户不存在</Typography>
        <Button variant="outlined" onClick={() => window.location.reload()}>
          重新加载
        </Button>
      </Box>
    );
  }

  console.log(currentUser.id)
  const isOwnProfile = currentUser && currentUser.id === parseInt(userId);

  return (
    <ThemeProvider theme={theme}>
      <Box sx={{ 
        bgcolor: 'background.default', 
        minHeight: '100vh', 
        pb: isMobile ? 8 : 4 
      }}>
        {/* 顶部横幅 */}
        <Box sx={{
          height: isMobile ? 200 : 250,
          background: 'linear-gradient(135deg, #ff9a9e 0%, #fad0c4 100%)',
          position: 'relative',
          borderBottomLeftRadius: 24,
          borderBottomRightRadius: 24,
          boxShadow: 1
        }}>
          <Fab 
            color="primary" 
            size="small" 
            sx={{ 
              position: 'absolute', 
              bottom: -20, 
              right: 16 
            }}
          >
            <CameraAlt />
          </Fab>
        </Box>

        <Container maxWidth="lg">
          {/* 用户信息区域 */}
          <Box sx={{ px: isMobile ? 3 : 0, mt: -8, position: 'relative' }}>
            <Grid container spacing={3}>
              <Grid item xs={12} sm="auto">
                <Badge
                  overlap="circular"
                  anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
                  badgeContent={
                    <IconButton 
                      size="small" 
                      sx={{ 
                        bgcolor: 'grey.200', 
                        '&:hover': { bgcolor: 'grey.300' } 
                      }}
                      onClick={() => setIsEditing(true)}
                      disabled={!isOwnProfile}
                    >
                      <Edit fontSize="small" />
                    </IconButton>
                  }
                >
                  <Avatar
                    sx={{ 
                      width: 120, 
                      height: 120, 
                      border: '4px solid white',
                      boxShadow: 3
                    }}
                    src={profileUser.avatar || 'https://www.8848seo.cn/zb_users/upload/2023/02/20230210092856_68763.jpeg'}
                  />
                </Badge>
              </Grid>
              
              <Grid item xs={12} sm>
                <Box sx={{ display: 'flex', justifyContent: 'space-between', flexDirection: isMobile ? 'column' : 'row' }}>
                  <Box>
                    <Typography variant="h5" fontWeight="bold">
                      {profileUser.username}
                    </Typography>
                    <Typography variant="subtitle1" sx={{ mt: 0.5, maxWidth: 600 }}>
                      {profileUser.bio || '这个人很懒，还没有写简介～'}
                    </Typography>
                    <Box sx={{ display: 'flex', mt: 1, gap: 1, flexWrap: 'wrap' }}>
                      <Chip 
                        icon={<LocationOn fontSize="small" />} 
                        label={formData.location}
                        size="small" 
                        variant="outlined" 
                      />
                      <Chip 
                        icon={<Cake fontSize="small" />} 
                        label={formData.birthday}
                        size="small" 
                        variant="outlined" 
                      />
                      <Chip 
                        icon={<Female fontSize="small" />} 
                        label={formData.gender}
                        size="small" 
                        variant="outlined" 
                      />
                    </Box>
                  </Box>
                  
                  <Box sx={{ mt: isMobile ? 2 : 0, alignSelf: 'flex-start' }}>
                    {isOwnProfile ? (
                      // 如果是自己的个人资料页面，显示注销按钮
                      <Button
                        variant="outlined"
                        color="error"
                        onClick={handleLogout}
                        sx={{ 
                          borderRadius: 20, 
                          px: 3, 
                          fontWeight: 'bold' 
                        }}
                      >
                        注销
                      </Button>
                    ) : currentUser && (
                      <>
                        <Button
                          variant={profileUser.is_following ? "outlined" : "contained"}
                          color="primary"
                          onClick={handleFollowToggle}
                          sx={{ 
                            borderRadius: 20, 
                            px: 3, 
                            fontWeight: 'bold' 
                          }}
                        >
                          {profileUser.is_following ? '已关注' : '关注'}
                        </Button>
                        <IconButton sx={{ ml: 1 }} onClick={handleMenuOpen}>
                          <MoreVert />
                        </IconButton>
                        <Menu
                          anchorEl={anchorEl}
                          open={menuOpen}
                          onClose={handleMenuClose}
                          anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
                          transformOrigin={{ vertical: 'top', horizontal: 'right' }}
                        >
                          <MenuItem onClick={handleLogout}>退出登录</MenuItem>
                        </Menu>
                      </>
                    )}
                  </Box>
                </Box>
                
                <Grid container spacing={2} sx={{ mt: 2 }}>
                  <Grid item>
                    <Box textAlign="center">
                      <Typography variant="h6">{allPosts.length}</Typography>
                      <Typography variant="body2" color="textSecondary">笔记</Typography>
                    </Box>
                  </Grid>
                  <Grid item>
                    <Box textAlign="center">
                      <Typography variant="h6">{profileUser.followers_count || 0}</Typography>
                      <Typography variant="body2" color="textSecondary">粉丝</Typography>
                    </Box>
                  </Grid>
                  <Grid item>
                    <Box textAlign="center">
                      <Typography variant="h6">{profileUser.following_count || 0}</Typography>
                      <Typography variant="body2" color="textSecondary">关注</Typography>
                    </Box>
                  </Grid>
                  <Grid item>
                    <Box textAlign="center">
                      {/* 使用真实数据：获赞与收藏总数 */}
                      <Typography variant="h6">
                        {(interactions.likes_count + interactions.favorites_count).toLocaleString()}
                      </Typography>
                      <Typography variant="body2" color="textSecondary">获赞与收藏</Typography>
                    </Box>
                  </Grid>
                </Grid>
              </Grid>
            </Grid>
          </Box>

          {/* 标签栏 */}
          <Box sx={{ mt: 4 }}>
            <Tabs 
              value={activeTab} 
              onChange={handleTabChange}
              variant={isMobile ? "fullWidth" : "standard"}
              indicatorColor="primary"
              textColor="primary"
              sx={{
                borderBottom: 1,
                borderColor: 'divider'
              }}
            >
              <Tab icon={isMobile ? <Collections /> : null} label="笔记" />
              <Tab icon={isMobile ? <Bookmark /> : null} label="收藏" />
              <Tab icon={isMobile ? <Group /> : null} label="关注" />
              <Tab icon={isMobile ? <People /> : null} label="粉丝" />
            </Tabs>
          </Box>

          {/* 内容区域 */}
          <Box sx={{ mt: 3 }}>
            
            {activeTab === 0 && (
              <Grid container spacing={3}>
                {tabLoading ? (
                  <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>
                    <CircularProgress />
                  </Grid>
                ) : posts.length > 0 ? (
                  posts.map((post, index) => (
                    <Grid item xs={12} sm={6} lg={3} key={post.id}>
                      <Card elevation={0} sx={{ 
                        bgcolor: 'white', 
                        borderRadius: 3,
                        height: '100%',
                        display: 'flex',
                        flexDirection: 'column'
                      }}>
                        {/* 只有当帖子有 media_urls 时才显示图片 */}
                      {post.media_urls && post.media_urls.length > 0 && (
                        <CardMedia
                          component="img"
                          height="180"
                          image={post.media_urls[0]}
                          alt={post.title}
                        />
                      )}
                        <CardContent sx={{ flexGrow: 1 }}>
                          <Typography gutterBottom variant="h6" component="div">
                            {post.title}
                          </Typography>
                          <Typography variant="body2" color="text.secondary">
                            {post.content.substring(0, 60)}...
                          </Typography>
                        </CardContent>
                        <CardActions sx={{ justifyContent: 'space-between', px: 2, pb: 2 }}>
                          <Box>
                            <IconButton aria-label="add to favorites">
                              <Favorite />
                              <Typography variant="body2" sx={{ ml: 1 }}>
                                {post.heat || Math.floor(Math.random() * 1000) + 1000}
                              </Typography>
                            </IconButton>
                            <IconButton aria-label="share">
                              <Share />
                            </IconButton>
                          </Box>
                          <Chip 
                            label={post.type === 'image' ? '图文' : post.type === 'video' ? '视频' : '文档'} 
                            size="small" 
                            color="primary" 
                            variant="outlined" 
                          />
                        </CardActions>
                      </Card>
                    </Grid>
                  ))
                ) : (
                  <Grid item xs={12}>
                    <Box sx={{ 
                      display: 'flex', 
                      flexDirection: 'column', 
                      alignItems: 'center', 
                      py: 8,
                      textAlign: 'center'
                    }}>
                      <Collections sx={{ fontSize: 60, color: 'grey.300', mb: 2 }} />
                      <Typography variant="h6" sx={{ mb: 1 }}>
                        还没有发布笔记
                      </Typography>
                      <Typography variant="body1" color="textSecondary" sx={{ mb: 3 }}>
                        {isOwnProfile ? '分享你的生活点滴吧～' : '该用户还没有发布任何笔记'}
                      </Typography>
                      {isOwnProfile && (
                        <Button variant="contained" color="primary">
                          发布第一篇笔记
                        </Button>
                      )}
                    </Box>
                  </Grid>
                )}
                
                {posts.length > 0 && (
                  <Grid item xs={12}>
                    <Box sx={{ display: 'flex', justifyContent: 'center', mt: 3 }}>
                      <Button 
                        variant="outlined" 
                        sx={{ 
                          borderRadius: 20, 
                          px: 4,
                          display: 'flex',
                          alignItems: 'center'
                        }}
                      >
                        <ChevronLeft sx={{ mr: 1 }} />
                        上一页
                        <ChevronRight sx={{ ml: 2 }} />
                      </Button>
                    </Box>
                  </Grid>
                )}
              </Grid>
            )}
            
            {activeTab === 1 && (
              <Grid container spacing={3}>
                {tabLoading ? (
                  <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>
                    <CircularProgress />
                  </Grid>
                ) : favorites.length > 0 ? (
                  favorites.map((favorite) => (
                    <Grid item xs={12} sm={6} md={4} lg={3} key={favorite.id}>
                      <Card elevation={0} sx={{ 
                        bgcolor: 'white', 
                        borderRadius: 3,
                        transition: 'transform 0.3s, box-shadow 0.3s',
                        '&:hover': {
                          transform: 'translateY(-5px)',
                          boxShadow: 3
                        }
                      }}>
                        <Box sx={{ 
                          height: 160, 
                          position: 'relative',
                          borderTopLeftRadius: 16,
                          borderTopRightRadius: 16,
                          overflow: 'hidden'
                        }}>
                          <CardMedia
                            component="img"
                            height="160"
                            image={`https://source.unsplash.com/random/400x300?${favorite.id}`}
                            alt={favorite.title}
                          />
                          <Box sx={{
                            position: 'absolute',
                            top: 8,
                            right: 8,
                            bgcolor: 'rgba(0,0,0,0.6)',
                            color: 'white',
                            px: 1,
                            py: 0.5,
                            borderRadius: 4,
                            fontSize: 12
                          }}>
                            {favorite.type === 'image' ? '图文' : favorite.type === 'video' ? '视频' : '文档'}
                          </Box>
                        </Box>
                        <CardContent>
                          <Typography gutterBottom variant="subtitle1" fontWeight="medium">
                            {favorite.title}
                          </Typography>
                          <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
                            <Box sx={{ display: 'flex', alignItems: 'center' }}>
                              <Favorite fontSize="small" color="error" />
                              <Typography variant="body2" sx={{ ml: 0.5 }}>
                                {favorite.heat || Math.floor(Math.random() * 1000) + 1000}
                              </Typography>
                            </Box>
                            <Box sx={{ display: 'flex', alignItems: 'center' }}>
                              <Bookmark fontSize="small" color="primary" />
                              <Typography variant="body2" sx={{ ml: 0.5 }}>
                                {Math.floor(Math.random() * 500) + 100}
                              </Typography>
                            </Box>
                          </Box>
                        </CardContent>
                      </Card>
                    </Grid>
                  ))
                ) : (
                  <Grid item xs={12}>
                    <Box sx={{ 
                      display: 'flex', 
                      flexDirection: 'column', 
                      alignItems: 'center', 
                      py: 8,
                      textAlign: 'center'
                    }}>
                      <Bookmark sx={{ fontSize: 60, color: 'grey.300', mb: 2 }} />
                      <Typography variant="h6" sx={{ mb: 1 }}>
                        {isOwnProfile ? '你还没有收藏内容' : '该用户没有收藏内容'}
                      </Typography>
                      <Typography variant="body1" color="textSecondary">
                        {isOwnProfile ? '看到喜欢的笔记可以收藏起来哦～' : ''}
                      </Typography>
                    </Box>
                  </Grid>
                )}
              </Grid>
            )}
            
            {activeTab === 2 && (
  <Grid container spacing={3}>
    {tabLoading ? (
      <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>
        <CircularProgress />
      </Grid>
    ) : following.length > 0 ? (
      following.map((follow) => (
        <Grid item xs={12} sm={6} md={4} key={follow.id}>
          <Paper 
            elevation={0} 
            sx={{ 
              bgcolor: 'white', 
              borderRadius: 3,
              p: 2,
              display: 'flex',
              alignItems: 'center',
              cursor: 'pointer',
              '&:hover': {
                boxShadow: 1
              }
            }}
            onClick={() => navigateToUserProfile(follow.id)}
          >
            <Avatar 
              src={follow.avatar || 'https://randomuser.me/api/portraits/men/22.jpg'} 
              sx={{ width: 60, height: 60 }} 
            />
            <Box sx={{ ml: 2, flexGrow: 1 }}>
              <Typography fontWeight="medium">{follow.username}</Typography>
              <Typography variant="body2" color="textSecondary">
                {follow.followers_count || Math.floor(Math.random() * 100) + 10} 粉丝
              </Typography>
            </Box>
            {isOwnProfile && (
              <Button 
                variant="outlined" 
                size="small"
                sx={{ borderRadius: 20 }}
                onClick={(e) => {
                  e.stopPropagation();
                  handleUnfollow(userId,follow.id);
                }}
              >
                已关注
              </Button>
            )}
          </Paper>
        </Grid>
      ))
    ) : (
      <Grid item xs={12}>
        <Box sx={{ 
          display: 'flex', 
          flexDirection: 'column', 
          alignItems: 'center', 
          py: 8,
          textAlign: 'center'
        }}>
          <Group sx={{ fontSize: 60, color: 'grey.300', mb: 2 }} />
          <Typography variant="h6" sx={{ mb: 1 }}>
            {isOwnProfile ? '你还没有关注任何人' : '该用户还没有关注任何人'}
          </Typography>
          <Typography variant="body1" color="textSecondary">
            {isOwnProfile ? '发现有趣的人并关注他们吧～' : ''}
          </Typography>
        </Box>
      </Grid>
    )}
  </Grid>
            )}
            {activeTab === 3 && (
              <Grid container spacing={3}>
                {tabLoading ? (
                  <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'center', py: 4 }}>
                    <CircularProgress />
                  </Grid>
                ) : followers.length > 0 ? (
                  followers.map((follower) => (
                    <Grid item xs={12} sm={6} md={4} key={follower.id}>
                      <Paper 
                        elevation={0} 
                        sx={{ 
                          bgcolor: 'white', 
                          borderRadius: 3,
                          p: 2,
                          display: 'flex',
                          alignItems: 'center',
                          cursor: 'pointer',
                          '&:hover': {
                            boxShadow: 1
                          }
                        }}
                        onClick={() => navigateToUserProfile(follower.id)}
                      >
                        <Avatar 
                          src={follower.avatar || 'https://randomuser.me/api/portraits/men/22.jpg'} 
                          sx={{ width: 60, height: 60 }} 
                        />
                        <Box sx={{ ml: 2, flexGrow: 1 }}>
                          <Typography fontWeight="medium">{follower.username}</Typography>
                          <Typography variant="body2" color="textSecondary">
                            {follower.bio || '暂无简介'}
                          </Typography>
                          <Typography variant="body2" color="textSecondary">
                            {follower.followers_count} 粉丝
                          </Typography>
                        </Box>
                        {currentUser && currentUser.id !== follower.id && (
                          <Button 
                            variant={follower.is_following ? "outlined" : "contained"}
                            color="primary"
                            size="small"
                            sx={{ borderRadius: 20 }}
                            onClick={(e) => {
                              e.stopPropagation();
                              if (follower.is_following) {
                                handleUnfollow(userId,follower.id);
                              } else {
                                handleFollowUser(userId,follower.id);
                              }
                            }}
                          >
                            {follower.is_following ? '已关注' : '关注'}
                          </Button>
                        )}
                      </Paper>
                    </Grid>
                  ))
                ) : (
                  <Grid item xs={12}>
                    <Box sx={{ 
                      display: 'flex', 
                      flexDirection: 'column', 
                      alignItems: 'center', 
                      py: 8,
                      textAlign: 'center'
                    }}>
                      <People sx={{ fontSize: 60, color: 'grey.300', mb: 2 }} />
                      <Typography variant="h6" sx={{ mb: 1 }}>
                        {isOwnProfile ? '你还没有粉丝' : '该用户还没有粉丝'}
                      </Typography>
                      <Typography variant="body1" color="textSecondary">
                        {isOwnProfile ? '分享更多内容来吸引粉丝吧～' : ''}
                      </Typography>
                    </Box>
                  </Grid>
                )}
              </Grid>
            )}
          </Box>
        </Container>

        {/* 底部导航栏 - 仅移动端显示 */}
        {isMobile && (
          <Box sx={{
            position: 'fixed',
            bottom: 0,
            left: 0,
            right: 0,
            bgcolor: 'white',
            boxShadow: 3,
            py: 1,
            display: 'flex',
            justifyContent: 'space-around'
          }}>
            <IconButton color="primary">
              <Search fontSize="large" />
            </IconButton>
            <IconButton>
              <Collections fontSize="large" />
            </IconButton>
            <Fab color="primary" size="medium" sx={{ mt: -2 }}>
              <Add />
            </Fab>
            <IconButton>
              <Notifications fontSize="large" />
            </IconButton>
            <IconButton>
              <Person fontSize="large" />
            </IconButton>
          </Box>
        )}

        {/* 编辑资料模态框 */}
        {isEditing && (
          <Box sx={{
            position: 'fixed',
            top: 0,
            left: 0,
            right: 0,
            bottom: 0,
            bgcolor: 'rgba(0,0,0,0.5)',
            zIndex: 1300,
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center',
            px: 2
          }}>
            <Paper sx={{ 
              width: '100%', 
              maxWidth: 600, 
              borderRadius: 4,
              overflow: 'hidden'
            }}>
              <Box sx={{ 
                bgcolor: 'primary.main', 
                color: 'white', 
                p: 2,
                display: 'flex',
                justifyContent: 'space-between',
                alignItems: 'center'
              }}>
                <Typography variant="h6">编辑资料</Typography>
                <IconButton color="inherit" onClick={() => setIsEditing(false)}>
                  <Close />
                </IconButton>
              </Box>
              
              <Box sx={{ p: 3 }}>
                <Box sx={{ display: 'flex', justifyContent: 'center', mb: 3 }}>
                  <Badge
                    overlap="circular"
                    anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
                    badgeContent={
                      <IconButton 
                        size="small" 
                        sx={{ 
                          bgcolor: 'grey.200',
                          '&:hover': { bgcolor: 'grey.300' }
                        }}
                      >
                        <CameraAlt fontSize="small" />
                      </IconButton>
                    }
                  >
                    <Avatar
                      sx={{ width: 100, height: 100 }}
                      src={formData.avatar || 'https://www.8848seo.cn/zb_users/upload/2023/02/20230210092856_68763.jpeg'}
                    />
                  </Badge>
                </Box>
                
                <TextField
                  fullWidth
                  label="用户名"
                  value={profileUser.username}
                  margin="normal"
                  disabled
                />
                
                <TextField
                  fullWidth
                  name="avatar"
                  label="头像URL"
                  value={formData.avatar}
                  onChange={handleFormChange}
                  margin="normal"
                />
                
                <TextField
                  fullWidth
                  name="bio"
                  label="个人简介"
                  value={formData.bio}
                  onChange={handleFormChange}
                  margin="normal"
                  multiline
                  rows={3}
                />
                
                <Grid container spacing={2} sx={{ mt: 1 }}>
                  <Grid item xs={6}>
                    <TextField
                      select
                      fullWidth
                      name="gender"
                      label="性别"
                      value={formData.gender}
                      onChange={handleFormChange}
                      margin="normal"
                    >
                      <MenuItem value="female">
                        <Box sx={{ display: 'flex', alignItems: 'center' }}>
                          <Female sx={{ mr: 1 }} /> 女
                        </Box>
                      </MenuItem>
                      <MenuItem value="male">
                        <Box sx={{ display: 'flex', alignItems: 'center' }}>
                          <Male sx={{ mr: 1 }} /> 男
                        </Box>
                      </MenuItem>
                      <MenuItem value="other">
                        <Box sx={{ display: 'flex', alignItems: 'center' }}>
                          <Public sx={{ mr: 1 }} /> 其他
                        </Box>
                      </MenuItem>
                    </TextField>
                  </Grid>
                  <Grid item xs={6}>
                    <TextField
                      fullWidth
                      name="birthday"
                      label="生日"
                      type="date"
                      value={formData.birthday}
                      onChange={handleFormChange}
                      margin="normal"
                      InputLabelProps={{ shrink: true }}
                    />
                  </Grid>
                </Grid>
                
                <TextField
                  fullWidth
                  name="location"
                  label="地区"
                  value={formData.location}
                  onChange={handleFormChange}
                  margin="normal"
                  InputProps={{
                    startAdornment: (
                      <InputAdornment position="start">
                        <LocationOn />
                      </InputAdornment>
                    ),
                  }}
                />
                
                <Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 3 }}>
                  <Button 
                    variant="outlined" 
                    sx={{ width: '48%' }}
                    onClick={() => setIsEditing(false)}
                    disabled={updating}
                  >
                    取消
                  </Button>
                  <Button 
                    variant="contained" 
                    color="primary" 
                    sx={{ width: '48%' }}
                    onClick={handleUpdateProfile}
                    disabled={updating}
                  >
                    {updating ? <CircularProgress size={24} /> : '保存'}
                  </Button>
                </Box>
              </Box>
            </Paper>
          </Box>
        )}

        {/* 提示信息 */}
        <Snackbar
          open={snackbar.open}
          autoHideDuration={3000}
          onClose={() => setSnackbar({ ...snackbar, open: false })}
          anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
        >
          <Alert 
            severity={snackbar.severity} 
            sx={{ width: '100%' }}
            onClose={() => setSnackbar({ ...snackbar, open: false })}
          >
            {snackbar.message}
          </Alert>
        </Snackbar>
      </Box>
    </ThemeProvider>
  );
};

export default UserProfile;