import React, { useState, useEffect } from "react";
import { API_BASE_URL } from "./config";

// State for appeals fetched from backend
export default function AppealPage() {
    const [appeals, setAppeals] = useState([]);
    const [selectedId, setSelectedId] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    // Helper to load appeals
    const fetchAppeals = async () => {
        setLoading(true);
        try {
            const res = await fetch(`${API_BASE_URL}/api/appeals`);
            if (!res.ok) throw new Error(`请求失败，状态码 ${res.status}`);
            const data = await res.json();
            // console.log("Fetched appeals:", data);
            setAppeals(data);
            if (data.length > 0) setSelectedId(data[0].appealid);
            setError(null);
        } catch (err) {
            setError(err.message);
        } finally {
            setLoading(false);
        }
    };

    useEffect(() => {
        fetchAppeals();
    }, []);

    if (loading) return <div>加载中...</div>;
    if (error) return <div>加载失败：{error}</div>;
    const selectedAppeal = appeals.find(a => a.appealid === selectedId) || {};

    // Approve selected appeal and refresh
    const handleApprove = async () => {
        try {
            const res = await fetch(`${API_BASE_URL}/api/appeals-approve`, {
                method: "POST",
                headers: { "Content-Type": "application/json" },
                body: JSON.stringify({ appealid: selectedAppeal.appealid })
            });
            if (!res.ok) throw new Error(`请求失败，状态码 ${res.status}`);
            alert("已通过申诉");
            await fetchAppeals();
        } catch (err) {
            alert(`操作失败：${err.message}`);
        }
    };
    // Reject selected appeal and refresh
    const handleReject = async () => {
      try {
        const res = await fetch(`${API_BASE_URL}/api/appeals-reject`, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({ appealid: selectedAppeal.appealid })
        });
        if (!res.ok) throw new Error(`请求失败，状态码 ${res.status}`);
        alert("已拒绝申诉");
        await fetchAppeals();
      } catch (err) {
        alert(`操作失败：${err.message}`);
      }
    };

    return (
        <div style={{ display: "flex", minHeight: "100vh", background: "#f7faff" }}>
            {/* 侧栏 */}
            <div style={{ width: 180, background: "#fff", borderRight: "1px solid #e0e7ff", padding: 0 }}>
                <h3 style={{ textAlign: "center", padding: "18px 0 0 0", color: "#1976d2" }}>申诉列表</h3>
                <div style={{ display: "flex", flexDirection: "column", gap: 12, marginTop: 18 }}>
                    {appeals.map(a => (
                        <div
                            key={a.appealid}
                            onClick={() => setSelectedId(a.appealid)}
                            style={{
                                margin: "0 12px",
                                padding: "16px 10px",
                                borderRadius: 8,
                                background: selectedId === a.appealid ? "#e3f2fd" : "#fff",
                                border: `2px solid ${a.status === 1 || a.status === 2 ? "#43a047" : "#e53935"}`,
                                color: a.status === 1 || a.status === 2 ? "#43a047" : "#e53935",
                                fontWeight: 600,
                                cursor: "pointer",
                                boxShadow: selectedId === a.appealid ? "0 2px 8px #b2d8ea" : "none",
                                transition: "all 0.2s"
                            }}
                        >
                            {a.user.username}
                            <span style={{
                                float: "right",
                                fontSize: 12,
                                color: a.status === 1 || a.status === 2 ? "#43a047" : "#e53935"
                            }}>
                                {a.status === 1 || a.status === 2 ? "已审核" : "未审核"}
                            </span>
                        </div>
                    ))}
                </div>
            </div>
            {/* 申诉详情 */}
            <div style={{ flex: 1, padding: "40px 48px" }}>
                <h2 style={{ marginBottom: 24, color: "#1976d2" }}>申诉详情</h2>
                <div style={{ background: "#fff", borderRadius: 12, padding: 32, boxShadow: "0 2px 8px #e0e7ff", marginBottom: 32 }}>
                    <div style={{ marginBottom: 18 }}>
                        <b>申诉ID：</b>{selectedAppeal.appealid}
                    </div>
                    <div style={{ marginBottom: 18 }}>
                        <b>用户ID：</b>{selectedAppeal.user.userid}
                    </div>
                    <div style={{ marginBottom: 18 }}>
                        <b>申诉内容：</b>{selectedAppeal.content}
                    </div>
                    <div style={{ marginBottom: 18 }}>
                        <b>申诉文件：</b>
                        <FileViewer url={selectedAppeal.fileURL} />
                    </div>
                </div>
                {/* 审核按钮 */}
                <div style={{ display: "flex", gap: 32, justifyContent: "center" }}>
                    <button
                        style={{
                            background: selectedAppeal.status === 1 ? "#bdbdbd" : "#43a047",
                            color: "#fff",
                            border: "none",
                            borderRadius: 8,
                            padding: "10px 38px",
                            fontWeight: 600,
                            fontSize: 18,
                            cursor: selectedAppeal.status === 1 ? "not-allowed" : "pointer"
                        }}
                        disabled={selectedAppeal.status === 1}
                        onClick={handleApprove}
                    >
                        通过
                    </button>
                    <button
                        style={{
                            background: selectedAppeal.status === 1 ? "#bdbdbd" : "#e53935",
                            color: "#fff",
                            border: "none",
                            borderRadius: 8,
                            padding: "10px 38px",
                            fontWeight: 600,
                            fontSize: 18,
                            cursor: selectedAppeal.status === 1 ? "not-allowed" : "pointer"
                        }}
                        disabled={selectedAppeal.status === 1}
                        onClick={handleReject}
                    >
                        不通过
                    </button>
                </div>
            </div>
        </div>
    );
}

// 简单PDF预览组件
function FileViewer({ url }) {
    if (!url) return <div>无附件</div>;
    if (url.endsWith(".pdf")) {
        return (
            <iframe
                src={url}
                title="PDF预览"
                width="100%"
                height="400px"
                style={{ border: "1px solid #ccc", borderRadius: 8 }}
            />
        );
    }
    // 这里只做PDF示例，实际可扩展为DOC等
    return <a href={url} target="_blank" rel="noopener noreferrer">下载附件</a>;
}