<template>
    <div class="app-container add-report" v-loading="loading">
        <div class="scroll div-content-scroll">
            <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
                <el-card>
                    <template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />报告基本信息
                    </template>


                    <el-row>
                        <el-col :span="8">
                            <el-form-item label="报告名称" prop="reportName">
                                <el-input v-model="form.reportName" placeholder="请输入报告名称" />
                            </el-form-item>
                        </el-col>
                        <el-col :span="16">
                            <el-form-item label="报告说明" prop="reportDesc">
                                <el-input v-model="form.reportDesc" placeholder="请输入数据集版本" />
                            </el-form-item>
                        </el-col>
                    </el-row>

                </el-card>

                <el-card style="margin-top: 10px;">
                    <template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />推理任务
                    </template>
                    <el-table :data="info.tableData" stripe class="data-table1">
                        <el-table-column label="任务名称" align="left" prop="task_name" />
                        <el-table-column label="任务说明" align="left" prop="task_desc" />
                        <el-table-column label="使用数据集" align="left" prop="dataset_name" />
                        <el-table-column label="运行模型" align="left" prop="model_name" width="120" />
                        <el-table-column label="模型网络" align="left" prop="modl_net_type" width="120" />
                        <el-table-column label="创建时间" align="left" prop="create_time" width="120" v-if="1 == 2" />
                        <el-table-column label="完成时间" align="left" prop="finish_time" width="120" />
                        <el-table-column label="操作" fixed="right" align="center" width="100">
                            <template #default="scope">
                                <el-button text type="primary" size="small"
                                    @click="doDelete(scope.row)"><i-ep-close-bold />删除</el-button>
                            </template>
                        </el-table-column>
                        <template #empty>
                            <el-button type="primary" @click="choiceTask">选择推理任务</el-button>
                        </template>
                    </el-table>

                    <div style="margin-top: 10px;"
                        v-if="['detection', 'classification', 'tracking'].indexOf(info.modl_sub_type) >= 0">
                        <div class="div-nav-header"><el-icon color="#409eff">
                                <Warning />
                            </el-icon>常用性能测评</div>
                        <el-row class="row-norm">
                            <el-col :span="12">
                                <el-form-item label="算法性能指标">
                                    <span v-for="(it, idx) in info.norm.lvl1" :key="idx">{{ it }}</span>
                                </el-form-item>

                            </el-col>
                            <el-col :span="12">
                                <el-form-item label="实时响应指标">
                                    <span v-for="(it, idx) in info.norm.lvl2" :key="idx">{{ it }}</span>
                                </el-form-item>

                            </el-col>
                        </el-row>
                    </div>
                    <div style="margin-top: 10px;" v-if="['detection', 'classification'].indexOf(info.modl_sub_type) >= 0">
                        <div class="div-nav-header"><el-icon color="#409eff">
                                <Warning />
                            </el-icon>算法阀值指标</div>
                        <el-row>
                            <el-col :span="8">
                                <el-form-item label="置信度阈值" prop="score_threshold">
                                    <el-input v-model="form.score_threshold" style="width: 120px;" class="txt-number"
                                        placeholder="请输入置信度阈值" type="number" />
                                </el-form-item>

                            </el-col>
                            <el-col :span="8">
                                <el-form-item label="IoU阈值" prop="nms_threshold">
                                    <el-input v-model="form.nms_threshold" style="width: 120px;" class="txt-number"
                                        placeholder="请输入置信度阈值" type="number" />
                                </el-form-item>
                            </el-col>
                        </el-row>
                    </div>
                </el-card>

                <el-card style="margin-top: 10px;" v-if="info.modl_sub_type">
                    <template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />更多测评
                    </template>

                    <el-table :data="info.tableData2" stripe class="data-table2">
                        <el-table-column label="任务名称" align="left" prop="task_name" />
                        <el-table-column label="任务说明" align="left" prop="task_desc" />
                        <el-table-column label="使用数据集" align="left" prop="dataset_name" />
                        <el-table-column label="运行模型" align="left" prop="model_name" width="120" />
                        <el-table-column label="模型网络" align="left" prop="modl_net_type" width="120" />
                        <el-table-column label="创建时间" align="left" prop="create_time" width="120" v-if="1 == 2" />
                        <el-table-column label="完成时间" align="left" prop="finish_time" width="120" />
                        <el-table-column label="操作" fixed="right" align="center" width="100">
                            <template #default="scope">
                                <el-button text type="primary" size="small" v-if="!scope.row.old"
                                    @click="doDeleteComp(scope.row)"><i-ep-close-bold />删除</el-button>
                            </template>
                        </el-table-column>
                        <template #empty>
                            <el-button type="primary" @click="choiceRobustTask">添加数据集比对任务</el-button>
                            <el-button type="primary" @click="choiceCompTask">添加硬件比对任务</el-button>
                        </template>
                    </el-table>

                </el-card>
            </el-form>
        </div>
        <choiceTaskDlg ref="taskDlg" @success="doChoiceSuccess" />

        <el-card class="card-footer">
            <el-button type="primary" @click="doSave">生成报告</el-button>
        </el-card>

    </div>
</template>

<script setup>
import choiceTaskDlg from './components/choiceTaskDlg.vue'
import ReportApi from '@/api/report'
import OperatorApi from '@/api/operator'
import LogApi from '@/api/log'
const router = useRouter();
const info = reactive({
    tableData: [],
    tableData2: [],
    modl_sub_type: '',
    norm: {
        lvl1: [],
        lvl2: [],
    },
    choiceType: '',
    optId:null,
    reportId:null,
})

const loading=ref(false);
const formRef=ref();
const form = ref({}); // 基础表单
const taskDlg = ref()
const validateScore = (r, v, callback) => {
    if (+v < 0 || +v >= 1) {
        return callback(new Error('值在0-1之间'))
    }
    callback()
}
// 校验规则
const rules = reactive({
    reportName: [{ required: true, message: "数据集名称不能为空", trigger: "blur" }],
    score_threshold: [
        { required: true, message: "置信度阈值不能为空", trigger: "blur" },
        { validator: validateScore, trigger: 'blur' }
    ],
    nms_threshold: [{ required: true, message: "IoU阈值不能为空", trigger: "blur" },
    { validator: validateScore, trigger: 'blur' }
    ],
});
//生成报告(验证)
function doSave() {
    formRef.value.validate(d=>{
      if(d){
        if(!info.tableData || info.tableData.length==0){
            ElMessage.error("请选择任务!");
            return;
        }
        doMakeReport();//生成报告
      }
    });
}
//生成报告
function doMakeReport(){
    loading.value = true;
    let postData={
        report_name:form.value.reportName,
        report_desc:form.value.reportDesc,
        task_id_list:info.tableData2 && info.tableData2.length>1?info.tableData2.map(d=>d.task_id):info.tableData.map(d=>d.task_id),
        extra_evaluation_type:info.choiceType       
    };
    if(info.choiceType=='horizontal_comparison'){
        postData.threshold={
            score_threshold:form.value.score_threshold,
            nms_threshold:form.value.nms_threshold
        };
    }
    ReportApi.addReport(postData).then(d=>{
        info.optId=d.data.data.operation_id;
        info.reportId=d.data.data.report_id;
        loadOptLog();       
    });
}
const loadOptLog=()=>{
    LogApi.userOperation(info.optId).then(d=>{
        if(!d.data.data.operation_finished){
            setTimeout(loadOptLog,3000);
        }else{
            loading.value = false;
            if(d.data.data.operation_success){
                router.push({ path: "/simulationEvaluation/reportDesc", query: { id:info.reportId} });
                ElMessage.success("生成报告成功!");
            }else{
                ElMessage.error("生成报告失败!");
            }
        }
    })
}
//删除已选择
function doDelete(row) {
    info.tableData = [];
    info.modl_sub_type = "";
}
//删除对比
function doDeleteComp(row) {
    let idx = info.tableData2.indexOf(row)
    if (idx >= 0) {
        info.tableData2 = info.tableData2.splice(idx, 1);
        if (info.tableData2.length == 1) {
            info.tableData2 = [];
            info.choiceType=''
        }
    }
}
//选择任务
function choiceTask() {
    info.choiceType = 'select'
    taskDlg.value.showDialog({});
}
//添加鲁棒性任务
function choiceRobustTask() {
    info.choiceType = 'robustness'
    let taskId = info.tableData && info.tableData.length > 0 ? info.tableData[0].task_id : '';
    let modl_sub_type=info.tableData && info.tableData.length > 0 ? info.tableData[0].modl_sub_type : '';
    taskDlg.value.showDialog({
        disTaskId: taskId,
        mult: false,
        modl_sub_type:modl_sub_type
    });
}
//添加对比任务
function choiceCompTask() {
    info.choiceType = 'horizontal_comparison'
    let taskId = info.tableData && info.tableData.length > 0 ? info.tableData[0].task_id : '';
    let modl_sub_type=info.tableData && info.tableData.length > 0 ? info.tableData[0].modl_sub_type : '';
    taskDlg.value.showDialog({
        disTaskId: taskId,
        mult: true,
        modl_sub_type:modl_sub_type
    });
}
function doChoiceSuccess(d) {
    if (info.choiceType !== 'select') {
        info.tableData2 = [];
        let it = info.tableData[0];
        it.old = true;
        info.tableData2 = [it, ...d];
    }
    info.tableData = d || [];
    info.modl_sub_type = info.tableData != null && info.tableData.length > 0 ? info.tableData[0].modl_sub_type || '' : '';
    if (['tracking'].indexOf(info.modl_sub_type) >= 0) {
        info.norm = {            
            lvl1: "1.IDSW (ID跳变),2.MT（跟踪轨迹）,3.ML（丢失轨迹）,4.FM（打断次数）,5.MOTA（跟踪准确度）".split(","),
            lvl2: "1. 平均推理时间,2. 系统延迟时间".split(",")
        }
        form.value.score_threshold = 0.5;
        form.value.nms_threshold = 0.5;
    } else if (['detection', 'classification'].indexOf(info.modl_sub_type) >= 0) {
        info.norm = {
            lvl1: "1.Precision（精确度）,2.Recall (召回率),3.F1-Score (F1分数),4. Micro F1,5. Macro F1,6.加权F1-Score,7.AP（平均精度）,8.mAP(多类平均精度),9.PR曲线".split(","),
            lvl2: "1. 平均推理时间,2. 系统延迟时间".split(",")
        }
        form.value.score_threshold = 0.5;
        form.value.nms_threshold = 0.5;
    } else {
        info.norm = {
            lvl1: [],
            lvl2: []
        }
    }
}
</script>

<style lang="scss">
.add-report {
    .el-card__header {
        padding: 8px 4px;
        display: flex;
        align-items: center;
    }

    .data-table1 {
        .el-table__empty-block {
            display: block;
            text-align: right;
        }
    }

    .txt-number {

        input::-webkit-inner-spin-button,
        input::-webkit-outer-spin-button {
            -webkit-appearance: none;
        }
    }

    .row-norm {
        .el-form-item__content {
            background: #eee;
            border-radius: 10px;
            padding: 10px;
            line-height: 20px;
            font-weight: bold;
            span{
                margin-right:8px;
            }
        }
    }

    .div-nav-header {
        font-size: 14px;
        font-weight: bold;
        color: #333;
        position: relative;

        .el-icon {
            position: relative;
            margin-right: 4px;
            top: 2px;
        }
    }

    .card-footer {
        position: fixed;
        width: calc(100% - 215px);
        bottom: 0px;

        .el-card__body {
            padding: 10px;

            .el-pagination {
                justify-content: end;
            }
        }
    }
    .div-content-scroll{
        margin-bottom: 60px;
        max-height: calc(100vh - 140px);
        overflow-y: auto;
    }
}
</style>