package com.cmvr.inspection.service;

import com.baomidou.mybatisplus.spring.service.IService;
import com.cmvr.device.service.InspectionAlertListenService;
import com.cmvr.inspection.domain.InspectionDetectionAlert;
import com.cmvr.inspection.domain.InspectionResult;
import com.cmvr.inspection.domain.InspectionTaskInstance;
import com.cmvr.inspection.domain.dto.InspectionResultQuery;
import com.cmvr.inspection.domain.dto.InspectionResultReviewRequest;
import com.cmvr.inspection.domain.vo.InspectionReportSummaryVo;
import com.cmvr.inspection.domain.vo.InspectionResultVo;
import com.cmvr.test.flow.runtime.event.FlowExecutionEvent;

import java.util.List;

/** 统一巡检结果业务接口。 */
public interface IInspectionResultService extends IService<InspectionResult>
{
    /**
     * 按任务、类型、状态、级别等条件查询巡检结果。
     *
     * @param query 查询条件，允许为空
     * @return 按发生时间倒序排列的巡检结果
     */
    List<InspectionResultVo> selectResultList(InspectionResultQuery query);

    /**
     * 查询巡检结果和全部媒体证据。
     *
     * @param id 巡检结果ID
     * @return 结果详情，不存在时返回null
     */
    InspectionResultVo selectResultById(String id);

    /**
     * 对待复核或识别失败结果进行人工判定。
     *
     * @param id 巡检结果ID
     * @param request 复核结论、告警级别、说明和版本
     * @return 更新后的巡检结果
     */
    InspectionResult review(String id, InspectionResultReviewRequest request);

    /**
     * 汇总单个巡检任务实例的结果数量、告警级别和复核完成状态。
     *
     * @param taskInstanceId 巡检任务实例数据库ID
     * @return 报表汇总
     */
    InspectionReportSummaryVo buildReportSummary(String taskInstanceId);

    /**
     * 从工作流节点标准输出中提取并保存巡检结果。
     *
     * @param event 节点完成事件
     * @param taskInstance 巡检任务实例
     * @return 保存后的结果；节点无巡检结果输出时返回null
     */
    InspectionResult recordWorkflowResult(FlowExecutionEvent event, InspectionTaskInstance taskInstance);

    /**
     * 将边缘端PPE事件转换为统一巡检结果，并按异常级别生成告警。
     *
     * @param alert 已保存的PPE原始事件
     * @param subscription 命中的工作流监听订阅
     * @param taskInstance 巡检任务实例，极端竞态下允许为空
     * @return 保存后的PPE巡检结果
     */
    InspectionResult recordPpeResult(InspectionDetectionAlert alert,
                                     InspectionAlertListenService.ListenSubscription subscription,
                                     InspectionTaskInstance taskInstance);
}
