import React, { useState, useEffect } from 'react';
import { Card, Table, Button, Space, Typography, message, Popconfirm, Spin } from 'antd';
import { UserOutlined, UploadOutlined, SettingOutlined } from '@ant-design/icons';
import { getUserList, deleteUser } from '@/api/auth';
import { useAuth } from '@/features/auth/contexts/AuthContext';

const { Title } = Typography;

const AdminPanel = () => {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);
  const { user } = useAuth();
  
  // 获取管理员信息
  const adminUser = user;
  
  // 加载用户数据
  useEffect(() => {
    fetchUsers();
  }, []);
  
  // 获取用户列表
  const fetchUsers = async () => {
    try {
      setLoading(true);
      const params = {
        username: adminUser.username,
      };
      const response = await getUserList(params);
      if (response && response.data) {
        const userList = response.data.users || [];
        const totalNumber = response.data.amount || 0;
        // 添加key属性
        const formattedUsers = userList.map(user => ({
          ...user,
          key: user.uid,
          role: user.level,
          status: '正常'
        }));
        setUsers(formattedUsers);
      }
    } catch (error) {
      message.error('获取用户列表失败');
    } finally {
      setLoading(false);
    }
  };
  
  // 删除用户
  const handleDelete = async (username) => {
    try {
      const params = {
        username: adminUser.username,
        targetUsername: username,
      };
      const response = await deleteUser(params);
      if (response.message) {
        message.success(response.message || '用户删除成功');
        fetchUsers(); // 重新加载用户列表
      }
    } catch (error) {
      message.error(error.message || '删除用户失败');
    }
  };

  const columns = [
    { title: '用户名', dataIndex: 'username', key: 'username' },
    { title: '角色', dataIndex: 'role', key: 'role' },
    { title: '状态', dataIndex: 'status', key: 'status' },
    { title: '注册日期', dataIndex: 'createTime', key: 'createTime' },
    {
      title: '操作',
      key: 'action',
      render: (_, record) => (
        <Space size="middle">
          {record.userType !== 1 && (
            <Popconfirm
              title="确定要删除该用户吗？"
              onConfirm={() => handleDelete(record.username)}
              okText="确定"
              cancelText="取消"
            >
              <Button type="link" danger>删除</Button>
            </Popconfirm>
          )}
        </Space>
      ),
    },
  ];

  return (
    <div className="p-6">
      <Title level={2}>管理员控制面板</Title>
      <div className="flex gap-4 mb-6">
        <Card title="用户统计" className="w-1/3">
          <div className="flex items-center">
            <UserOutlined className="text-2xl mr-2" />
            <span className="text-xl">{users.length} 名用户</span>
          </div>
        </Card>
        <Card title="资源统计" className="w-1/3">
          <div className="flex items-center">
            <UploadOutlined className="text-2xl mr-2" />
            <span className="text-xl">25 个资源</span>
          </div>
        </Card>
        <Card title="系统状态" className="w-1/3">
          <div className="flex items-center">
            <SettingOutlined className="text-2xl mr-2" />
            <span className="text-xl">运行正常</span>
          </div>
        </Card>
      </div>
      <Card title="用户管理">
        {loading ? (
          <div className="flex justify-center py-8">
            <Spin size="large" tip="加载中..." />
          </div>
        ) : (
          <Table columns={columns} dataSource={users} />
        )}
      </Card>
    </div>
  );
};

export default AdminPanel;