import React, { useState, useEffect } from "react";
import AccountCircleIcon from "@mui/icons-material/AccountCircle";
import { useNavigate } from "react-router-dom";
import { API_BASE_URL } from "./config";
import "./App.css";

export default function UserProfile() {
  const navigate = useNavigate();
  const [userInfo, setUserInfo] = useState({
    avatar_url: "",
    username: "示例用户",
    email: "user@example.com",
    invite_left: "",
    school: "",
    account_status: "",
    gender: "",
  });
  const [tempUserInfo, setTempUserInfo] = useState({ ...userInfo });
  const [userSeeds, setUserSeeds] = useState([]);
  const [userStats, setUserStats] = useState({
    magic: 0,
    upload: 0,
    download: 0,
    ratio: 0,
  });

  // 新增：根据userid从后端获取用户信息
  useEffect(() => {
    const fetchUserInfo = async () => {
      // 假设userid存储在localStorage或其他地方
      // const userid = localStorage.getItem("userid");
      const userid = "550e8400-e29b-41d4-a716-446655440000"; // 示例userid
      if (!userid) return;
      try {
        const res = await fetch(`${API_BASE_URL}/api/user-profile?userid=${userid}`);

        if (res.ok) {
          const data = await res.json();
          setUserInfo(data);
          setTempUserInfo(data);
          // console.log(data);
        }
      } catch (err) {
        // 可以根据需要处理错误
        console.error("获取用户信息失败", err);
      }
    };
    fetchUserInfo();
  }, []);

  // 动态加载用户上传种子列表
  useEffect(() => {
    const fetchUserSeeds = async () => {
      // const userid = localStorage.getItem("userid");
      const userid = "550e8400-e29b-41d4-a716-446655440000"; // 示例userid
      if (!userid) return;
      try {
        const res = await fetch(`${API_BASE_URL}/api/user-seeds?userid=${userid}`);
        if (res.ok) {
          const data = await res.json();
          setUserSeeds(data);
        }
      } catch (err) {
        console.error("获取种子列表失败", err);
      }
    };
    fetchUserSeeds();
  }, []);

  // 动态加载用户活跃度信息
  useEffect(() => {
    const fetchUserStats = async () => {
      // const userid = localStorage.getItem("userid");
      const userid = "550e8400-e29b-41d4-a716-446655440000"; // 示例userid
      if (!userid) return;
      try {
        const res = await fetch(`${API_BASE_URL}/api/user-stats?userid=${userid}`);
        if (res.ok) {
          const data = await res.json();
          setUserStats(data);
        }
      } catch (err) {
        console.error("获取活跃度信息失败", err);
      }
    };
    fetchUserStats();
  }, []);

  const handleInputChange = (field, value) => {
    setTempUserInfo({ ...tempUserInfo, [field]: value });
  };

  const handleSave = async () => {
    if (tempUserInfo.gender === "男性") {
      tempUserInfo.gender = "m";
    } else if (tempUserInfo.gender === "女性") {
      tempUserInfo.gender = "f";
    }
    setUserInfo({ ...tempUserInfo });
    console.log("保存的用户信息：", tempUserInfo);
    // 获取userid
    // const userid = localStorage.getItem("userid");
    const userid = "550e8400-e29b-41d4-a716-446655440000"; // 示例userid
    try {
      const res = await fetch(`${API_BASE_URL}/api/change-profile`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ userid, ...tempUserInfo }),
      });
      if (res.ok) {
        alert("信息已保存！");
      } else {
        alert("保存失败，请重试。");
      }
    } catch (err) {
      alert("保存失败，请检查网络连接。");
      console.error("保存用户信息失败", err);
    }
  };

  const handleAvatarClick = () => {
    const pictureUrl = prompt("请输入头像的URL：");
    if (pictureUrl) {
      setTempUserInfo({ ...tempUserInfo, avatar_url: pictureUrl });
    }
  };

  return (
    <div className="container" style={{ minHeight: '100vh', background: 'linear-gradient(135deg, #f0f4ff 0%, #e0e7ff 100%)', display: 'grid', gridTemplateColumns: '1fr 2fr', gridTemplateRows: 'auto 1fr', gap: '20px', padding: '40px' }}>
      {/* 左侧：用户资料 */}
      <div style={{ gridColumn: '1 / 2', gridRow: '1 / 3', display: 'flex', flexDirection: 'column', alignItems: 'center', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>
        <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: 16 }}>
          <div onClick={handleAvatarClick} style={{ cursor: 'pointer', position: 'relative' }}>
            <AccountCircleIcon style={{ fontSize: 90, color: '#1a237e', marginBottom: 12 }} />
            {tempUserInfo.avatar_url && (
              <img
                src={tempUserInfo.avatar_url}
                alt="用户头像"
                style={{
                  position: 'absolute',
                  top: 0,
                  left: 0,
                  width: 90,
                  height: 90,
                  borderRadius: '50%',
                  objectFit: 'cover',
                }}
              />
            )}
          </div>
          <h2 style={{ color: '#1a237e', marginBottom: 0, fontSize: 24 }}>用户个人资料</h2>
        </div>
        <div className="card" style={{ padding: 28, width: '100%', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', flex: 1 }}>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>用户名：</b>
            <input
              type="text"
              value={tempUserInfo.username}
              onChange={(e) => handleInputChange("username", e.target.value)}
              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}
            />
          </div>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>邮箱：</b>
            <span
              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15, backgroundColor: '#f5f5f5', color: '#888' }}
            >
              {tempUserInfo.email}
            </span>
          </div>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>邀请剩余：</b>
            <span
              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15, backgroundColor: '#f5f5f5', color: '#888' }}
            >
              {tempUserInfo.invite_left || "0"}
            </span>
          </div>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>学校：</b>
            <input
              type="text"
              value={tempUserInfo.school}
              onChange={(e) => handleInputChange("school", e.target.value)}
              style={{ flex: 1, padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15 }}
            />
          </div>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>账号状态：</b>
            <span
              style={{ flex: 1, display: 'flex', alignItems: 'center', padding: '6px 10px', borderRadius: 7, border: '1px solid #b2b2b2', minWidth: 0, fontSize: 15, backgroundColor: '#f5f5f5', color: '#888' }}
            >
              {tempUserInfo.account_status === 1 || tempUserInfo.account_status === "1" ? "封禁" : "正常"}
              <span style={{
                display: 'inline-block',
                width: 12,
                height: 12,
                borderRadius: '50%',
                backgroundColor: tempUserInfo.account_status === 1 || tempUserInfo.account_status === "1" ? '#e53935' : '#43a047',
                marginLeft: 10,
                border: '1px solid #b2b2b2',
              }} />
            </span>
          </div>
          <div style={{ marginBottom: 18, display: 'flex', alignItems: 'center' }}>
            <b style={{ width: 72, textAlign: 'left', marginRight: 0, fontSize: 16 }}>性别：</b>
            <div style={{ position: 'relative', flex: 1 }}>
              <button
                onClick={() => setTempUserInfo({ ...tempUserInfo, showGenderOptions: !tempUserInfo.showGenderOptions })}
                style={{
                  width: '100%',
                  padding: '6px 10px',
                  borderRadius: 7,
                  border: '1px solid #b2b2b2',
                  textAlign: 'left',
                  backgroundColor: '#fff',
                  fontSize: 15,
                  cursor: 'pointer',
                }}
              >
                {tempUserInfo.gender === 'm' ? '男性'
                  : tempUserInfo.gender === 'f' ? '女性'
                    : '性别'}
              </button>
              {tempUserInfo.showGenderOptions && (
                <ul
                  style={{
                    position: 'absolute',
                    top: '100%',
                    left: 0,
                    right: 0,
                    backgroundColor: '#fff',
                    border: '1px solid #b2b2b2',
                    borderRadius: 7,
                    listStyle: 'none',
                    margin: 0,
                    padding: 0,
                    zIndex: 10,
                  }}
                >
                  {[{ value: 'm', label: '男性' }, { value: 'f', label: '女性' }].map(opt => (
                    <li
                      key={opt.value}
                      onClick={() => setTempUserInfo({ ...tempUserInfo, gender: opt.value, showGenderOptions: false })}
                      style={{
                        padding: '6px 10px',
                        cursor: 'pointer',
                        borderBottom: '1px solid #e0e0e0',
                        backgroundColor: tempUserInfo.gender === opt.value ? '#f0f0f0' : '#fff',
                      }}
                    >
                      {opt.label}
                    </li>
                  ))}
                </ul>
              )}
            </div>
          </div>
          <button
            onClick={handleSave}
            style={{
              marginTop: 20,
              padding: '10px 20px',
              backgroundColor: '#1a237e',
              color: '#fff',
              border: 'none',
              borderRadius: 7,
              cursor: 'pointer',
              fontSize: 16,
              alignSelf: 'center', // Center the button horizontally
            }}
            onMouseOver={(e) => (e.target.style.backgroundColor = '#0d1b5e')}
            onMouseOut={(e) => (e.target.style.backgroundColor = '#1a237e')}
          >
            保存
          </button>
        </div>
      </div>
      {/* 上传种子列表 */}
      <div style={{ gridColumn: '2 / 3', gridRow: '1 / 2', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>
        <h3 style={{ color: '#1a237e', fontSize: 22, marginBottom: 18 }}>个人上传种子列表</h3>
        <div style={{ border: '1px dashed #b2b2b2', borderRadius: 12, minHeight: 60, padding: 12 }}>
          {userSeeds.length === 0 ? (
            <div style={{ color: '#b2b2b2', fontSize: 18, textAlign: 'center' }}>（暂无上传种子）</div>
          ) : (
            <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>
              {userSeeds.map((seed, idx) => (
                <li
                  key={seed.seed_id || idx}
                  style={{ display: 'flex', alignItems: 'center', padding: '10px 0', borderBottom: '1px solid #e0e7ff', cursor: 'pointer' }}
                  onClick={e => {
                    // 阻止点击删除按钮时跳转
                    if (e.target.classList.contains('delete-btn')) return;
                    navigate(`/torrent/${seed.seedid}`);
                  }}
                >
                  <span style={{ flex: 2, fontWeight: 500, color: '#1a237e', textDecoration: 'underline' }}>{seed.title}</span>
                  <span style={{ flex: 1, color: '#5c6bc0' }}>{seed.tags}</span>
                  <span style={{ flex: 1, color: '#ff9800', textAlign: 'right' }}>人气: {seed.downloadtimes}</span>
                  <button
                    className="delete-btn"
                    style={{ marginLeft: 18, background: '#e53935', color: '#fff', border: 'none', borderRadius: 6, padding: '4px 14px', cursor: 'pointer', fontSize: 14 }}
                    onClick={async (e) => {
                      e.stopPropagation();
                      // const userid = localStorage.getItem("userid");
                      // const userid = "550e8400-e29b-41d4-a716-446655440000"; // 示例userid
                      try {

                        const res = await fetch(`${API_BASE_URL}/api/delete-seed`, {
                          method: 'POST',
                          headers: { 'Content-Type': 'application/json' },
                          body: JSON.stringify({ seedid: seed.seedid }),
                        });
                        // console.log(seed.seedid);
                        if (res.ok) {
                          setUserSeeds(userSeeds.filter((s, i) => (s.seedid || i) !== (seed.seedid || idx)));
                        } else {
                          alert('删除失败，请重试');
                        }
                      } catch (err) {
                        alert('删除失败，请检查网络');
                      }
                    }}
                  >删除</button>
                </li>
              ))}
            </ul>
          )}
        </div>
      </div>
      {/* 活跃度模块 */}
      <div style={{ gridColumn: '2 / 3', gridRow: '2 / 3', background: '#fff', borderRadius: 18, boxShadow: '0 4px 24px #e0e7ff', padding: '20px' }}>
        <h3 style={{ color: '#1a237e', fontSize: 22, marginBottom: 18 }}>活跃度</h3>
        <div style={{ border: '1px dashed #b2b2b2', borderRadius: 12, minHeight: 60, padding: 18, display: 'flex', flexDirection: 'column', gap: 12, fontSize: 18 }}>
          <div>魔力值：<b style={{ color: '#1976d2' }}>{userStats.magic}</b></div>
          <div>上传量：<b style={{ color: '#43a047' }}>{userStats.upload} GB</b></div>
          <div>下载量：<b style={{ color: '#e53935' }}>{userStats.download} GB</b></div>
          <div>上传/下载值：<b style={{ color: '#ff9800' }}>{userStats.ratio}</b></div>
        </div>
      </div>
    </div>
  );
}