'use client';
import React, {useEffect, useRef, useState} from 'react';
// import {TabView, TabPanel} from "primereact/tabview";
import {Card} from "primereact/card";
import {Image} from "primereact/image";
import {Button} from "primereact/button";
// 弹窗
import { Dialog } from 'primereact/dialog';
import {InputText} from "primereact/inputtext";
import {InputTextarea} from "primereact/inputtextarea";
import {FileUpload} from "primereact/fileupload";
// 类型转换
import {toNumber} from "lodash";
// 消息提醒
import {Toast} from 'primereact/toast';
// 接口传输
import axios from "axios";
// 页面跳转
import {useRouter} from "next/navigation";
// 分页
import { Paginator, type PaginatorPageChangeEvent } from 'primereact/paginator';
// 密码
import { Password } from 'primereact/password';
// 样式
import './resources.scss';



// 用户发布的资源
interface Resource {
    resourceId: number;
    resourceName: string;
    resourcePicture: string;
    resourceSummary: string; // 资源简介（一句话）
    resourceDetail: string; // 资源介绍
    uploadTime: string; // 上传时间
    lastUpdateTime: string; // 最近更新时间
    price: number;
    downloads: number;
    likes: number;
    collections: number;
    comments: number;
    seeds: number; // 种子数
    classify: string; // 资源分类(材质包：resourcePack,模组：mod,整合包：modPack ,地图：map
}

// 用户发布的资源列表
interface ResourceList {
    records: Resource[];
    total: number; // 总记录数
    pages: number; // 总页数
    current: number; // 当前页码
    sizes: number; // 每页大小
}

export default function UserManageResources() {
    // 路由
    const router = useRouter();
    // 发布资源列表
    const [resourceList, setResourceList] = useState<Resource[]>([]);
    // 要删除资源的id
    const [deleteResourceId, setDeleteResourceId] =  useState<number>(0);
    // 资源封面路径
    const [resourcePictureUrl, setResourcePictureUrl] = useState<string>('');
    // 编辑资源的分类
    const [resourceClassify, setResourceClassify] = useState<string>('');
    // 消息提醒
    const toast = useRef<Toast>(null);
    // 分页
    const [first, setFirst] = useState(0);
    const [rows, setRows] = useState(5);
    const [totalResources, setTotalResources] = useState<number>(0);
    const onPageChange = (event: PaginatorPageChangeEvent) => {
        setFirst(event.first);
        setRows(event.rows);
    };
    // 删除资源弹窗
    const [deleteVisible, setDeleteVisible] = useState(false);
    const [deleteResourceFormData, setDeleteResourceFormData] = useState({
        password: '',
    });

    // 编辑资源弹窗
    const [editVisible, setEditVisible] = useState(false);
    const [editResourceFormData, setEditResourceFormData] = useState({
        resourceId: 0,
        resourceName: '',
        resourceSummary: '',
        resourceDetail: '',
        price: '',
    });

    useEffect(() => {
        fetchResourceList();
    }, [first, rows]);


    // 获取用户发布资源
    const fetchResourceList = async () => {
        try {
            const pageNumber = first / rows + 1;
            const response = await axios.get<ResourceList>(process.env.PUBLIC_URL + `/user/upload`, {
                params: {userId: 22301010, pageNumber: pageNumber, rows: rows}
            });

            console.log('获取发布资源列表：', response.data.records);
            setResourceList(response.data.records);
            setTotalResources(response.data.total);
        } catch (err) {
            console.error('获取发布资源失败', err);
            toast.current?.show({severity: 'error', summary: 'error', detail: '获取发布资源失败'});
        }
    };

    // 处理删除资源接口
    const handleDeleteSubmit = async () => {
        try {
            const deleteData = {
                resourceId: deleteResourceId,
                userId: 223010100,
                password: deleteResourceFormData.password,
            };
            // 发送DELETE请求
            const response = await axios.delete(process.env.PUBLIC_URL + `/resource`, {
                params: {resourceId: deleteData.resourceId, userId: deleteData.userId, password: deleteData.password},
            });
            console.log("用户" + 22301010 + "要删除" + deleteData.resourceId + "号资源");
            console.log(deleteData);

            if (response.status === 204) {
                console.log("用户成功删除资源");
                // setIsDeleteResource(true);
                toast.current?.show({severity: 'success', summary: 'Success', detail: '删除资源成功'});
                setDeleteVisible(false);
                // 重置表单
                setDeleteResourceFormData({
                    password: '',
                });
                // 重新拉取资源列表
                fetchResourceList();
            } else {
                console.log('用户密码错误');
                toast.current?.show({severity: 'error', summary: 'Error', detail: '密码错误，删除资源失败'});
            }

        } catch (error) {
            console.error('资源删除失败:', error);
            toast.current?.show({ severity: 'error', summary: 'error', detail: '密码错误，资源删除失败' });
        }
    };

    // 处理编辑资源接口
    const handleEditSubmit = async () => {
        try {
            const postData = {
                resourceId: editResourceFormData.resourceId,
                resourceName: editResourceFormData.resourceName,
                resourcePicture: resourcePictureUrl,
                resourceSummary: editResourceFormData.resourceSummary,
                resourceDetail: editResourceFormData.resourceDetail,
                price: toNumber(editResourceFormData.price),
                classify: resourceClassify,
            };
            // 发送POST请求
            const response = await axios.put(process.env.PUBLIC_URL + '/resource/info', postData);
            console.log("编辑资源的信息：", postData);

            if (response.status === 200) {
                toast.current?.show({ severity: 'success', summary: 'Success', detail: '资源编辑成功' });
                // 编辑成功
                setEditVisible(false);
                fetchResourceList();
            }
        } catch (error) {
            console.error('资源上传失败:', error);
            toast.current?.show({ severity: 'error', summary: 'error', detail: '资源上传失败' });
        }
    };

    return (
        <div className="resources-container">
            <Toast ref={toast}></Toast>
            <div className="resources-title">
                <h1>我上传的资源</h1>
            </div>

            <div className="resource-list">
                {resourceList.map((resourceList) => (
                    <Card key={resourceList.resourceId} className="resources-list-card"
                          onClick={() => router.push(`/resource/resource-detail/${resourceList.resourceId}`)}>
                        <Image alt="avatar"
                               src={process.env.NEXT_PUBLIC_NGINX_URL + "resource/" + resourceList.resourcePicture}
                               className="resource-avatar" width="250" height="140"/>
                        <div className="resource-header">
                            <div className="resource-content">
                                <h3>{resourceList.resourceName}</h3>
                            </div>

                            <div className="resource-operation">
                                <Button
                                    label="编辑"
                                    onClick={(e) => {
                                        e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
                                        setEditVisible(true);
                                        
                                        setResourceClassify(resourceList.classify);
                                        setEditResourceFormData({
                                            resourceId: resourceList.resourceId,
                                            resourceName: resourceList.resourceName,
                                            resourceSummary: resourceList.resourceSummary,
                                            resourceDetail: resourceList.resourceDetail,
                                            price: resourceList.price.toString(),
                                        });
                                        console.log("用户编辑资源");
                                    }}
                                />
                                <Button
                                    label="删除"
                                    onClick={(e) => {
                                        e.stopPropagation(); // 关键修复：阻止事件冒泡，避免触发Card的点击事件
                                        setDeleteResourceId(resourceList.resourceId);
                                        setDeleteVisible(true);
                                    }}
                                    style={{backgroundColor: "rgba(255, 87, 51, 1)"}}
                                />
                            </div>
                        </div>
                    </Card>
                ))}
                {totalResources > 5 && <Paginator
                    className="Paginator"
                    first={first}
                    rows={rows}
                    totalRecords={totalResources}
                    rowsPerPageOptions={[5, 10]}
                    onPageChange={onPageChange}
                />}
            </div>

            {/*删除资源时，获取用户密码弹窗*/}
            <Dialog
                header="删除资源"
                visible={deleteVisible}
                onHide={() => setDeleteVisible(false)}
                className="resource-delete-dialog"
                modal
                footer={
                    <div className="dialog-footer">
                        <Button label="确认" icon="pi pi-check" onClick={handleDeleteSubmit} autoFocus />
                        <Button label="取消" icon="pi pi-times" onClick={() => setDeleteVisible(false)} className="p-button-text" />
                    </div>
                }
            >
                <div className="dialog-form">
                    <div className="form-field">
                        <div className="form-field-header">
                            <label htmlFor="name">密码</label>
                        </div>
                        <Password
                            id="passwrod"
                            value={deleteResourceFormData.password}
                            onChange={(e) => setDeleteResourceFormData(prev => ({
                                ...prev,
                                password: e.target.value
                            }))}
                            placeholder="请输入密码"
                            className="w-full"
                            toggleMask
                        />
                    </div>
                </div>
            </Dialog>

            {/*编辑资源弹窗*/}
            <Dialog
                header="编辑资源"
                visible={editVisible}
                onHide={() => setEditVisible(false)}
                className="resource-edit-dialog"
                modal
                footer={
                    <div className="dialog-footer">
                        <Button label="确认" icon="pi pi-check" onClick={handleEditSubmit} autoFocus />
                        <Button label="取消" icon="pi pi-times" onClick={() => setEditVisible(false)} className="p-button-text" />
                    </div>
                }
            >
                <div className="dialog-form">
                    <div className="form-field">
                        <div className="form-field-header">
                            <label htmlFor="name">资源名称</label>
                        </div>
                        <InputText
                            id="name"
                            value={editResourceFormData.resourceName}
                            onChange={(e) => setEditResourceFormData(prev => ({
                                ...prev,
                                resourceName:  e.target.value
                            }))}
                            className="w-full"
                        />
                    </div>
                    <div className="form-field">
                        <div className="form-field-header">
                            <label htmlFor="summary">资源简介</label>
                        </div>
                        <InputText
                            id="summary"
                            value={editResourceFormData.resourceSummary}
                            onChange={(e) => setEditResourceFormData(prev => ({
                                ...prev,
                                resourceSummary:  e.target.value
                            }))}
                            className="w-full"
                        />
                    </div>
                    <div className="form-field">
                        <div className="form-field-header">
                            <label htmlFor="detail">资源介绍</label>
                        </div>
                        <InputTextarea
                            id="detail"
                            value={editResourceFormData.resourceDetail}
                            onChange={(e) => setEditResourceFormData(prev => ({
                                ...prev,
                                resourceDetail:  e.target.value
                            }))}
                            rows={5}
                            className="w-full"
                        />
                    </div>
                    <div className="form-field">
                        <div className="form-field-header">
                            <label htmlFor="price">价格</label>
                        </div>
                        <InputText
                            id="price"
                            value={editResourceFormData?.price.toString()}
                            onChange={(e) => setEditResourceFormData(prev => ({
                                ...prev,
                                price:  e.target.value
                            }))}
                            className="w-full"
                        />
                    </div>
                    <div className="form-field">
                        <div className="form-field-header">
                            <span className="form-field-sign">*</span>
                            <label>封面图片</label>
                        </div>

                        <FileUpload
                            mode="advanced"
                            name="resource-image"
                            customUpload

                            uploadHandler={async (e) => {
                                const formData = new FormData();
                                formData.append("file", e.files[0]);

                                try {
                                    const res = await axios.post(`${process.env.PUBLIC_URL}/file`, formData);

                                    const fileUrl = res.data.url;
                                    console.log(fileUrl);
                                    setResourcePictureUrl(fileUrl);
                                    toast.current?.show({ severity: 'success', summary: '上传成功' });
                                } catch (error) {
                                    console.log(error);
                                    toast.current?.show({ severity: 'error', summary: '上传失败' });
                                }
                            }}
                            auto
                            accept="image/*"
                            chooseLabel="选择资源封面"
                        />
                    </div>
                </div>
            </Dialog>
        </div>
    )
};
