// import React, { useState, useEffect } from 'react';
// import { useGroupStore } from '../../context/useGroupStore';
// import { useUser } from '../../context/UserContext';
// import CreatePostForm from './CreatePostForm';
// import axios from 'axios'; // 新增

// const GroupItem = ({ group }) => {
//   const { handleJoinGroup, joinStatus, setJoinStatus } = useGroupStore(); // 假设你有 setJoinStatus 方法
//   const { user } = useUser();

//   const userId = user?.userId;
//   const groupId = group.groupId;

//   const [isMember, setIsMember] = useState(false);

//   useEffect(() => {
//     setIsMember(joinStatus[groupId] === '加入成功');
//   }, [joinStatus, groupId]);

//   const [showCreatePost, setShowCreatePost] = useState(false);

//   // 退出小组函数（新增）
//   const handleLeaveGroup = async () => {
//     try {
//       const res = await axios.post(`/echo/groups/${groupId}/leave`, {
//         user_id: userId,
//       });
//       if (res.data.status === 'success') {
//         setJoinStatus(groupId, '未加入'); // 更新全局状态（需确保 useGroupStore 中有此方法）
//         setIsMember(false); // 本地状态也更新
//       } else {
//         alert(res.data.message || '退出失败');
//       }
//     } catch (error) {
//       console.error('退出小组失败:', error);
//       alert('退出小组失败');
//     }
//   };

//   return (
//     <div className="group-item">
//       <div className="group-content">
//         <img
//           style={{ width: '40%', height: '40%' }}
//           src={group.coverImage || 'https://picsum.photos/200/200'}
//           alt={group.groupName}
//           className="group-cover"
//         />
//         <div className="group-info-right">
//           <h3>{group.groupName}</h3>
//           <p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>

//           {/* 加入/退出按钮逻辑 */}
//           {userId && (
//             <button
//               onClick={() => {
//                 if (isMember) {
//                   handleLeaveGroup(); // 已加入 -> 退出
//                 } else {
//                   handleJoinGroup(groupId, userId); // 未加入 -> 加入
//                 }
//               }}
//             >
//               {isMember ? '退出小组' : '+加入小组'}
//             </button>
//           )}
//           {!userId && <button disabled>请登录</button>}

//           {/* 发布帖子按钮 */}
//           {userId && isMember && (
//             <button onClick={() => setShowCreatePost(!showCreatePost)}>
//               +发布帖子
//             </button>
//           )}
//         </div>
//       </div>

//       <div className="group-description">
//         <p>{group.description}</p>
//       </div>
//       <p>分类：{group.category}</p>

//       {showCreatePost && (
//         <CreatePostForm 
//           groupId={groupId}
//           onClose={() => setShowCreatePost(false)}
//         />
//       )}
//     </div>
//   );
// };

// export default GroupItem;

import React, { useState, useEffect } from 'react';
import { useGroupStore } from '../../context/useGroupStore';
import { useUser } from '../../context/UserContext';
import CreatePostForm from './CreatePostForm';
import axios from 'axios';

const GroupItem = ({ group }) => {
  const { handleJoinGroup, joinStatus, setJoinStatus } = useGroupStore();
  const { user } = useUser();

  const userId = user?.userId;
  const groupId = group.groupId;

  const [isMember, setIsMember] = useState(false);
  const [loading, setLoading] = useState(false); // 新增：加载状态
  const [error, setError] = useState(''); // 新增：错误信息

  useEffect(() => {
    console.log('joinStatus updated:', joinStatus);
    setIsMember(joinStatus[groupId] === '加入成功');
  }, [joinStatus, groupId]);

  // 初始挂载时检查成员状态（新增）
  useEffect(() => {
    if (userId && groupId) {
      checkMembershipStatus();
    }
  }, [userId, groupId]);

  // 检查成员状态（新增）
  const checkMembershipStatus = async () => {
    try {
      const res = await axios.get(`/echo/groups/${groupId}/members`);
      const isMember = res.data.members.some(member => member.user_id === userId);
      setJoinStatus(groupId, isMember ? '加入成功' : '未加入');
    } catch (error) {
      console.error('检查成员状态失败:', error);
    }
  };

  const [showCreatePost, setShowCreatePost] = useState(false);

  const handleLeaveGroup = async () => {
    setLoading(true);
    try {
      const res = await axios.post(`/echo/groups/${groupId}/leave`, {
        user_id: userId,
      });
      if (res.data.status === 'success') {
        setJoinStatus(groupId, '未加入');
        setIsMember(false);
        // 可选：刷新小组成员计数
        group.memberCount = (group.memberCount || 0) - 1;
      } else {
        setError(res.data.message || '退出失败');
      }
    } catch (error) {
      console.error('退出小组失败:', error);
      setError('退出小组失败');
    } finally {
      setLoading(false);
    }
  };

  // 修改加入小组逻辑（新增）
  const handleJoin = async () => {
    setLoading(true);
    try {
      const res = await handleJoinGroup(groupId, userId);
      if (res && res.status === 'success') {
        setJoinStatus(groupId, '加入成功');
        setIsMember(true);
        // 可选：刷新小组成员计数
        group.memberCount = (group.memberCount || 0) + 1;
      } else {
        setError(res?.message || '加入失败');
      }
    } catch (error) {
      console.error('加入小组失败:', error);
      setError('加入小组失败');
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="group-item">
      <div className="group-content">
        <img
          style={{ width: '40%', height: '40%' }}
          src={group.coverImage || 'https://picsum.photos/200/200'}
          alt={group.groupName}
          className="group-cover"
        />
        <div className="group-info-right">
          <h3>{group.groupName}</h3>
          <p style={{ color: '#BA929A' }}>{group.memberCount || 0}人加入了小组</p>

          {/* 加入/退出按钮逻辑 */}
          {userId && (
            <button
              onClick={() => {
                if (isMember) {
                  handleLeaveGroup();
                } else {
                  handleJoin();
                }
              }}
              disabled={loading}
            >
              {loading ? '处理中...' : isMember ? '退出小组' : '+加入小组'}
            </button>
          )}
          {!userId && <button disabled>请登录</button>}

          {/* 显示错误信息（新增） */}
          {error && <p style={{ color: 'red' }}>{error}</p>}

          {/* 发布帖子按钮 */}
          {userId && isMember && (
            <button onClick={() => setShowCreatePost(!showCreatePost)}>
              +发布帖子
            </button>
          )}
        </div>
      </div>

      <div className="group-description">
        <p>{group.description}</p>
      </div>
      <p>分类：{group.category}</p>

      {showCreatePost && (
        <CreatePostForm 
          groupId={groupId}
          onClose={() => setShowCreatePost(false)}
        />
      )}
    </div>
  );
};

export default GroupItem;
