package digital.laboratory.platform.inspection.service;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import digital.laboratory.platform.common.core.util.R;
import digital.laboratory.platform.inspection.dto.*;
import digital.laboratory.platform.inspection.entity.TestRecordSampleData;
import digital.laboratory.platform.inspection.query.AnalysisTestResultPageQuery;
import digital.laboratory.platform.inspection.query.QueryTestResultPageQuery;
import digital.laboratory.platform.inspection.utils.datafile.hair.HairSewageCompoundData;
import digital.laboratory.platform.inspection.utils.datafile.nps.NPSDataFileStruct;
import digital.laboratory.platform.inspection.vo.TestRecordSampleDataVO;
import digital.laboratory.platform.inspection.vo.TestResultBusinessVO;

import javax.servlet.http.HttpServletRequest;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

/**
 * @author xy
 * @version 1.0
 * @title TestRecordSampleDataService
 * @description
 * @create 2024/1/18 11:04
 */

public interface TestRecordSampleDataService  extends IService<TestRecordSampleData> {

    /**
     * 校验实验状态是否完成，完成则提升不能修改数据
     * @param testId
     */
    void validateTestStatus(String testId);


    Boolean saveTestDataFromNps(List<NPSDataFileStruct> npsDataFileStructList,String testId);

    //获取检验记录中的样品信息数据
    List<NPSCaseTestDataDto> getNPSSampleTestDataByTestId(String testId);

    /**
     * 根据业务id查询检验数据
     * @param businessId
     * @return
     */
    List<?> getSampleTestDataByBusiness(String businessId);

    /**
     * 毛发案件检验数据读取处理保存到数据库
     *
     * @param hairCompoundDataMap 文件数据map
     * @param testId 实验id
     * @return
     */
    Boolean saveTestDataHairCase(Map<String, List<HairSewageCompoundData>> hairCompoundDataMap, String testId);

    List<?> getSampleTestDataByTestId(String testId, String type);

    /**
     * 分页查询 根据实验id获取不同类型的数据
     * @param pageDTO
     * @return
     */
    IPage<TestRecordSampleDataVO> getSampleTestDataByTestIdPage(AnalysisTestResultPageQuery pageDTO);

    /**
     * 分页查询 获取审核的任务检验数据, header 是自定义头  data 是分页对象
     * @param pageDTO
     * @return
     */
    Map<String, Object> queryWaitApproveTaskTestDataPage(TaskTestDataPageDTO pageDTO);

    /**
     * 毛发、污水任务检验数据导入并保存到数据库
     *
     * @param sewageCompoundDataMap
     * @param testId
     * @param fileTypeCode
     * @return
     */
    Boolean saveTestDataHairSewageTask(Map<String, List<HairSewageCompoundData>> sewageCompoundDataMap, String testId, String fileTypeCode);

    /**
     * 实验结果查询中分页查询
     * @param testResultBusinessVOPage
     * @param dto
     * @return
     */
    IPage<TestResultBusinessVO> queryTestResultPage(Page<TestResultBusinessVO> testResultBusinessVOPage, QueryTestResultPageQuery dto, Object... arg);

    /**
     * 修改导入的实验数据
     *
     * @param dtoList
     * @return
     */
    boolean updateEntrustTestData(List<SampleInspectDataDTO> dtoList);

    /**
     * 获取任务实验结果数据
     * @param testId
     * @return
     */
    Map<String, JSONArray> queryTaskTestResult(String testId);

    /**
     * 根据业务id获取任务实验结果数据
     * @param businessId
     * @return
     */
    Map<String, JSONArray> queryTaskTestResultByBusiness(String businessId);

    /**
     * 保存实验数据的定量结果
     * @param dto
     * @return
     */
    boolean saveQuantitativeResults(SaveQuantitativeResultsDTO dto);

    /**
     * 删除实验数据的定量结果
     * @param testSampleDataId
     * @return
     */
    boolean deleteQuantitativeResults(String testSampleDataId);

    /**
     * 判断当前实验数据是否保存
     * @param testId
     * @return
     */
    boolean whetherSave(String testId);

    /**
     * 根据业务id生成定性结果
     * @param businessId
     * @return
     */
    String generateQualitativeResults(String businessId);

    /**
     * 完成实验
     * @param testId
     * @return
     */
    R finishTest(String testId);

    /**
     * 审核审批数据
     *
     * @param auditDataDTO
     * @param httpServletRequest
     * @return
     */
    R auditTaskTestData(AuditDataDTO auditDataDTO, HttpServletRequest httpServletRequest);

    void autoCreateData(String testId, String reagentId);

    boolean autoDelData(String testId, String reagentId);

    /**
     * 删除检验数据
     * @param testId
     */
    void delete(String testId);

    Comparator getSortBySampleNo();

}
