<template>
    <el-upload :accept="accept" :action="action" :before-remove="delUploadData" :before-upload="beforeUpload" :data="uploadData"
               :disabled="uploadDisabled" :file-list="fileListData" :headers="getTokenHeader()" :on-error="uploadError"
               :on-exceed="uploadExceed" :on-preview="uploadPreview" :on-progress="uploadprogress"
               :on-remove="uploadRemove" :on-success="uploadSuccess" class="hc-upload-border"
               drag multiple>
        <div v-loading="uploadDisabled" :element-loading-text="loadingText" class="hc-upload-loading">
            <HcIcon name="backup" ui="text-5xl mt-4"/>
            <div class="el-upload__text">拖动文件到这里 或 <em>点击这里选择文件</em> 并上传</div>
        </div>
        <template #tip>
            <div class="el-upload__tip" style="font-size: 14px;">允许格式：jpg/png/pdf/excel/word， 文件大小 小于 60MB
            </div>
        </template>
    </el-upload>
</template>

<script setup>
import {ref, watch, onMounted} from "vue";
import {getTokenHeader} from '~src/api/request/header';
import wbsApi from "~api/data-fill/wbs"
import {isFileSize} from "js-fast-way"

const props = defineProps({
    fileList: {
        type: Array,
        default: () => ([])
    },
    datas: {
        type: Object,
        default: () => ({})
    },
    baseData: {
        type: Object,
        default: () => ({})
    },
    contractId: {
        type: String,
        default: () => ('')
    },
    tableTypeValue: {
        type: String,
        default: () => ('')
    }
})

//变量
const uploadData = ref(props.datas)
const fileListData = ref(props.fileList);
const contractId = ref(props.contractId);
const tableType = ref(props.tableTypeValue);
const baseData = ref(props.baseData);

const action = '/api/blade-business/detection/self/add-buss-file';
const accept = 'image/png,image/jpg,image/jpeg,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/pdf,.doc,.docx,application/msword';
const uploadDisabled = ref(false)

//监听
watch(() => [
    props.fileList,
    props.datas,
], ([fileList, datas]) => {
    uploadData.value = datas
    fileListData.value = fileList
})

//渲染完成
onMounted(() => {
    beforeFileNum.value = 0
    finishFileNum.value = 0
    errorFileNum.value = 0
})

//事件
const emit = defineEmits(['change'])

//上传前
const beforeFileNum = ref(0)
const beforeUpload = async (file) => {
    if (isFileSize(file?.size, 60)) {
        beforeFileNum.value++;
        return true;
    } else {
        window?.$message?.warning('文件大小, 不能过60M!');
        return false;
    }
}

//超出限制时
const uploadExceed = () => {
    window?.$message?.warning('请上传 jpg/png/pdf/excel/word 的文件，文件大小 不超过60M');
}

//上传中
const loadingText = ref('上传中...')
const uploadprogress = () => {
    loadingText.value = '上传中...'
    uploadDisabled.value = true
}

//上传完成
const finishFileNum = ref(0)
const uploadSuccess = () => {
    finishFileNum.value++;
    if (beforeFileNum.value === finishFileNum.value) {
        uploadDisabled.value = false
        emit('change', {type: 'success'})
    }
}

//上传失败
const errorFileNum = ref(0)
const uploadError = () => {
    errorFileNum.value++;
    window?.$message?.error('上传失败');
    const num = finishFileNum.value + errorFileNum.value;
    if (beforeFileNum.value === num) {
        uploadDisabled.value = false
        emit('change', {type: 'success'})
    }
}

//预览
const uploadPreview = ({url}) => {
    if (url) {
        window.open(url, '_blank')
    }
}

//删除文件
const delUploadData = async ({id}) => {

    loadingText.value = '删除中...'
    uploadDisabled.value = true
    const {error, code} = await wbsApi.removeBussFile1({
        ids: id,
        tableType: tableType.value,
        contractId: contractId.value,
        id: baseData.value.id
    })
    uploadDisabled.value = false
    if (!error && code === 200) {
        window?.$message?.success('删除成功')
        return true
    } else {
        return false
    }
}

const uploadRemove = () => {
    if (fileListData.value.length <= 0) {
        emit('change', {type: 'del'})
    }
}
</script>
