import { useState } from "react";
import { Link } from "wouter";
import "./AuthPage.css";
import CryptoJS from "crypto-js";


function AuthPage() {
  const [activeTab, setActiveTab] = useState("login");

  // Login form state
  const [loginData, setLoginData] = useState({
    username: "",
    password: "",
    rememberMe: false,
  });

  // Register form state
  const [registerData, setRegisterData] = useState({
    username: "",
    email: "",
    password: "",
    confirmPassword: "",
    inviteCode: "",
  });

  // Form errors
  const [errors, setErrors] = useState({
    login: {},
    register: {},
  });

  const hashPassword = (password) => {
    return CryptoJS.SHA256(password).toString(CryptoJS.enc.Hex);
  };

  // Handle login form submission
  const handleLogin = async (e) => {
  e.preventDefault();

  const newErrors = {};
  if (!loginData.username) {
    newErrors.username = "请输入用户名或邮箱";
  }
  if (!loginData.password) {
    newErrors.password = "请输入密码";
  }

  if (Object.keys(newErrors).length > 0) {
    setErrors((prev) => ({ ...prev, login: newErrors }));
    return;
  }

  try {
    const response = await fetch("/echo/user/login", {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        username: loginData.username,
        password: loginData.password,
      }),
    });

    const data = await response.json();

    if (data.msg === "登录成功" && data.user) {
      // 保存用户信息到 localStorage
      localStorage.setItem("user", JSON.stringify(data.user));
      localStorage.setItem("userId", data.user.userId); // 如果有 id 字段
      debugger
      // window.location.href = '/forum';
    } else {
      throw new Error(data.msg || "登录失败");
    }
  } catch (error) {
    console.error('登录错误:', error.message);
    setErrors((prev) => ({
      ...prev,
      login: { message: error.message },
    }));
  }
};


  // Handle register form submission
  const handleRegister = async (e) => {
  e.preventDefault();

  const newErrors = {};
  if (!registerData.username) {
    newErrors.username = "请输入用户名";
  }
  if (!registerData.email) {
    newErrors.email = "请输入邮箱";
  } else if (!/\S+@\S+\.\S+/.test(registerData.email)) {
    newErrors.email = "邮箱格式不正确";
  }
  if (!registerData.password) {
    newErrors.password = "请输入密码";
  } else if (registerData.password.length < 6) {
    newErrors.password = "密码长度至少为6位";
  }
  if (registerData.password !== registerData.confirmPassword) {
    newErrors.confirmPassword = "两次输入的密码不一致";
  }

  if (Object.keys(newErrors).length > 0) {
    setErrors((prev) => ({ ...prev, register: newErrors }));
    return;
  }

  const hashedPassword = hashPassword(registerData.password);

  try {
    const response = await fetch("/echo/user/register", {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        username: registerData.username,
        email: registerData.email,
        password: hashedPassword,
        role: "user", // 默认角色，可根据实际情况调整
        inviteCode: registerData.inviteCode,
      }),
    });

    const data = await response.json();

    if (data.msg === "注册成功") {
      alert("注册成功，请登录！");
      setActiveTab("login");
    } else {
      throw new Error(data.msg || "注册失败");
    }
  } catch (error) {
    console.error("注册错误:", error.message);
    setErrors((prev) => ({
      ...prev,
      register: { message: error.message },
    }));
  }
};


  // Update login form data
  const updateLoginData = (field, value) => {
    setLoginData({
      ...loginData,
      [field]: value,
    });
  };

  // Update register form data
  const updateRegisterData = (field, value) => {
    setRegisterData({
      ...registerData,
      [field]: value,
    });
  };

  return (
    <div className="auth-container">
      <div className="auth-card">
        <div className="auth-header">
          <div className={`auth-tab ${activeTab === "login" ? "active" : ""}`} onClick={() => setActiveTab("login")}>
            登录
          </div>
          <div className={`auth-tab ${activeTab === "register" ? "active" : ""}`} onClick={() => setActiveTab("register")}>
            注册
          </div>

        </div>

        <div className="auth-content">
          {activeTab === "login" ? (
            <form className="auth-form" onSubmit={handleLogin}>
              {errors.login.message && <div className="error-message">{errors.login.message}</div>}
              <div className="form-group">
                <label htmlFor="login-username">用户名/邮箱</label>
                <input
                  type="text"
                  id="login-username"
                  value={loginData.username}
                  onChange={(e) => updateLoginData("username", e.target.value)}
                  placeholder="请输入用户名或邮箱"
                  required
                />
                {errors.login.username && <div className="error-message">{errors.login.username}</div>}
              </div>

              <div className="form-group">
                <label htmlFor="login-password">密码</label>
                <input
                  type="password"
                  id="login-password"
                  value={loginData.password}
                  onChange={(e) => updateLoginData("password", e.target.value)}
                  placeholder="请输入密码"
                  required
                />
                {errors.login.password && <div className="error-message">{errors.login.password}</div>}
              </div>

              <div className="form-group-inline">
                <div className="checkbox-container">
                  <input
                    type="checkbox"
                    id="remember-me"
                    checked={loginData.rememberMe}
                    onChange={(e) => updateLoginData("rememberMe", e.target.checked)}
                  />
                  <label htmlFor="remember-me">记住我</label>
                </div>
                <Link to="/forgot-password" className="forgot-password">
                  忘记密码?
                </Link>
              </div>

              <button type="submit" className="auth-button">
                登录
              </button>
            </form>
          ) : (
            <form className="auth-form" onSubmit={handleRegister}>
              {errors.register.message && <div className="error-message">{errors.register.message}</div>}
              <div className="form-group">
                <label htmlFor="register-username">用户名</label>
                <input
                  type="text"
                  id="register-username"
                  value={registerData.username}
                  onChange={(e) => updateRegisterData("username", e.target.value)}
                  placeholder="请输入用户名"
                  required
                />
                {errors.register.username && <div className="error-message">{errors.register.username}</div>}
              </div>

              <div className="form-group">
                <label htmlFor="register-email">邮箱</label>
                <input
                  type="email"
                  id="register-email"
                  value={registerData.email}
                  onChange={(e) => updateRegisterData("email", e.target.value)}
                  placeholder="请输入邮箱"
                  required
                />
                {errors.register.email && <div className="error-message">{errors.register.email}</div>}
              </div>

              <div className="form-group">
                <label htmlFor="register-password">密码</label>
                <input
                  type="password"
                  id="register-password"
                  value={registerData.password}
                  onChange={(e) => updateRegisterData("password", e.target.value)}
                  placeholder="请输入密码"
                  required
                />
                {errors.register.password && <div className="error-message">{errors.register.password}</div>}
              </div>

              <div className="form-group">
                <label htmlFor="register-confirm-password">确认密码</label>
                <input
                  type="password"
                  id="register-confirm-password"
                  value={registerData.confirmPassword}
                  onChange={(e) => updateRegisterData("confirmPassword", e.target.value)}
                  placeholder="请再次输入密码"
                  required
                />
                {errors.register.confirmPassword && (
                  <div className="error-message">{errors.register.confirmPassword}</div>
                )}
              </div>

              <div className="form-group">
                <label htmlFor="register-inviteCode">邀请码</label>
                <input
                  type="text"
                  id="register-inviteCode"
                  value={registerData.inviteCode}
                  onChange={(e) => updateRegisterData("inviteCode", e.target.value)}
                  placeholder="请输入邀请码"
                />
                {errors.register.inviteCode && <div className="error-message">{errors.register.inviteCode}</div>}
              </div>

              <button type="submit" className="auth-button">
                注册
              </button>
            </form>
          )}
        </div>
      </div>
    </div>
  );
}

export default AuthPage;