// src/features/auth/pages/LoginPage.jsx
import React, { useState } from "react";
import { useNavigate, Link } from "react-router-dom";
import {
  Form,
  Input,
  Button,
  Checkbox,
  Card,
  Typography,
  Space,
  Divider,
  message,
} from "antd";
import { UserOutlined, LockOutlined } from "@ant-design/icons";
import { useAuth } from "../contexts/AuthContext"; // 使用新的 AuthContext

const { Title, Text } = Typography;

const LoginPage = () => {
  const [loading, setLoading] = useState(false);
  const navigate = useNavigate();
  const { login, isAuthenticated, user } = useAuth(); // 从 Context 获取 login 方法等

  React.useEffect(() => {
    // 如果已经登录，并且有用户信息，则重定向到首页
    if (isAuthenticated && user) {
      navigate("/");
    }
  }, [isAuthenticated, user, navigate]);

  const onFinish = async (values) => {
    setLoading(true);
    try {
      const params = {
        username: values.username,
        password: values.password,
      };
      const userData = await login(params);
      
      // 根据用户角色导航到不同页面
      if (userData && userData.role === 'admin') {
        navigate("/admin"); // 管理员导航到管理面板
      } else {
        navigate("/"); // 普通用户导航到首页
      }
    } catch (error) {
      // 错误消息由 AuthContext 中的 login 方法或 request 拦截器处理
      console.error("Login page error:", error);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="flex justify-center items-center min-h-screen bg-slate-100 p-4">
      {" "}
      {/* Tailwind: bg-gray-100 -> bg-slate-100 */}
      <Card className="w-full max-w-md shadow-lg rounded-lg">
        {" "}
        {/* Tailwind: rounded-lg */}
        <div className="text-center mb-8">
          {" "}
          {/* Tailwind: mb-6 -> mb-8 */}
          <Title level={2} className="!mb-2 text-slate-700">
            PT站登录
          </Title>{" "}
          {/* Tailwind: text-slate-700 */}
          <Text type="secondary">欢迎回来，请登录您的账号</Text>
        </div>
        <Form
          name="login_form" // 最好给表单一个唯一的名字
          initialValues={{ remember: true }}
          onFinish={onFinish}
          size="large"
          layout="vertical"
          className="space-y-6" // Tailwind: 间距控制
        >
          <Form.Item
            name="username"
            rules={[{ required: true, message: "请输入您的用户名!" }]}
          >
            <Input
              prefix={<UserOutlined className="site-form-item-icon" />}
              placeholder="用户名"
            />
          </Form.Item>
          <Form.Item
            name="password"
            rules={[{ required: true, message: "请输入您的密码!" }]}
          >
            <Input.Password
              prefix={<LockOutlined className="site-form-item-icon" />}
              placeholder="密码"
            />
          </Form.Item>
          <Form.Item className="!mb-0">
            {" "}
            {/* Tailwind: !mb-0 覆盖antd默认margin */}
            <div className="flex justify-between items-center">
              <Form.Item name="remember" valuePropName="checked" noStyle>
                <Checkbox>记住我</Checkbox>
              </Form.Item>
              <Link
                to="/forgot-password"
                className="text-blue-600 hover:text-blue-700 hover:underline"
              >
                {" "}
                {/* Tailwind: hover:underline */}
                忘记密码?
              </Link>
            </div>
          </Form.Item>
          <Form.Item>
            <Button
              type="primary"
              htmlType="submit"
              className="w-full !text-base"
              loading={loading}
            >
              {" "}
              {/* Tailwind: !text-base (示例) */}登 录
            </Button>
          </Form.Item>
          <Divider plain>
            <span className="text-slate-500">或</span>
          </Divider>{" "}
          {/* Tailwind: text-slate-500 */}
          <div className="text-center space-y-3">
            <div>
              <Text type="secondary" className="mr-1">
                还没有账号？
              </Text>
              <Link
                to="/register"
                className="font-medium text-blue-600 hover:text-blue-700 hover:underline"
              >
                立即注册
              </Link>
            </div>
            <div>
              <Link
                to="/admin/login"
                className="font-medium text-orange-600 hover:text-orange-700 hover:underline"
              >
                管理员登录
              </Link>
            </div>
          </div>
        </Form>
        {/* 提示信息部分可以保留或移除 */}
        <div className="mt-8 p-4 bg-slate-50 rounded-md border border-slate-200">
          {" "}
          {/* Tailwind: border, border-slate-200 */}
          <Text
            type="secondary"
            className="block mb-2 font-semibold text-slate-600"
          >
            测试账号提示
          </Text>
          <ul className="space-y-1 text-sm text-slate-500 list-disc list-inside">
            <li>管理员: admin / admin123</li>
            <li>普通用户: user / user123</li>
            {/* ...其他测试账号 */}
          </ul>
        </div>
      </Card>
    </div>
  );
};

export default LoginPage;
