import { useCallback, useState } from "react";
import {
	UploadOutlined,
	CheckCircleOutlined,
	DeleteOutlined,
} from "@ant-design/icons";
import { Upload, Progress, Button } from "antd";
import type { UploadFile } from "antd";
import { useTusUpload } from "@web/src/hooks/useTusUpload";
import toast from "react-hot-toast";

export interface TusUploaderProps {
	value?: string[];
	onChange?: (value: string[]) => void;
}

interface UploadingFile {
	name: string;
	progress: number;
	status: "uploading" | "done" | "error";
	fileId?: string;
	fileKey?: string;
}

export const TusUploader = ({ value = [], onChange }: TusUploaderProps) => {
	const { handleFileUpload, uploadProgress } = useTusUpload();
	const [uploadingFiles, setUploadingFiles] = useState<UploadingFile[]>([]);
	const [completedFiles, setCompletedFiles] = useState<UploadingFile[]>(
		() =>
			value?.map((fileId) => ({
				name: `文件 ${fileId}`,
				progress: 100,
				status: "done" as const,
				fileId,
			})) || []
	);
	// 恢复使用 uploadResults 状态跟踪最新结果
	const [uploadResults, setUploadResults] = useState<string[]>(value || []);
	const handleRemoveFile = useCallback(
		(fileId: string) => {
			setCompletedFiles((prev) =>
				prev.filter((f) => f.fileId !== fileId)
			);
			// 使用函数式更新保证获取最新状态
			setUploadResults((prev) => {
				const newValue = prev.filter((id) => id !== fileId);
				onChange?.(newValue); // 同步更新父组件
				return newValue;
			});
		},
		[onChange]
	);

	const handleBeforeUpload = useCallback(
		(file: File) => {
			const fileKey = `${file.name}-${Date.now()}`;

			setUploadingFiles((prev) => [
				...prev,
				{
					name: file.name,
					progress: 0,
					status: "uploading",
					fileKey,
				},
			]);

			handleFileUpload(
				file,
				(result) => {
					setCompletedFiles((prev) => [
						...prev,
						{
							name: file.name,
							progress: 100,
							status: "done",
							fileId: result.fileId,
						},
					]);

					setUploadingFiles((prev) =>
						prev.filter((f) => f.fileKey !== fileKey)
					);

					// 正确的状态更新方式
					setUploadResults((prev) => {
						const newValue = [...prev, result.fileId];
						onChange?.(newValue); // 传递值而非函数
						return newValue;
					});
				},
				(error) => {
					console.error("上传错误:", error);
					toast.error(
						`上传失败: ${
							error instanceof Error ? error.message : "未知错误"
						}`
					);
					setUploadingFiles((prev) =>
						prev.map((f) =>
							f.fileKey === fileKey
								? { ...f, status: "error" }
								: f
						)
					);
				},
				fileKey
			);

			return false;
		},
		[handleFileUpload, onChange]
	);

	return (
		<div className="space-y-1">
			<Upload.Dragger
				name="files"
				multiple
				showUploadList={false}
				style={{ background: "transparent", borderStyle: "none" }}
				beforeUpload={handleBeforeUpload}>
				<p className="ant-upload-drag-icon">
					<UploadOutlined />
				</p>
				<p className="ant-upload-text">
					点击或拖拽文件到此区域进行上传
				</p>
				<p className="ant-upload-hint">支持单个或批量上传文件</p>

				{/* 上传状态展示 */}
				<div className="px-2 py-0 rounded mt-1">
					{/* 上传中的文件 */}
					{uploadingFiles.map((file) => (
						<div
							key={file.fileKey}
							className="flex flex-col gap-1 mb-2">
							<div className="flex items-center gap-2">
								<span className="text-sm">{file.name}</span>
							</div>
							<Progress
								percent={
									file.status === "done"
										? 100
										: Math.round(
												uploadProgress?.[
													file.fileKey!
												] || 0
											)
								}
								status={
									file.status === "error"
										? "exception"
										: "active"
								}
							/>
						</div>
					))}

					{/* 已完成的文件 */}
					{completedFiles.map((file) => (
						<div
							key={file.fileId}
							className="flex items-center justify-between gap-2 mb-2">
							<div className="flex items-center gap-2">
								<CheckCircleOutlined className="text-green-500" />
								<span className="text-sm">{file.name}</span>
							</div>
							<Button
								type="text"
								danger
								icon={<DeleteOutlined />}
								onClick={(e) => {
									e.stopPropagation();
									if (file.fileId)
										handleRemoveFile(file.fileId);
								}}
							/>
						</div>
					))}
				</div>
			</Upload.Dragger>
		</div>
	);
};
