package com.supervision.service.impl;

import com.supervision.dto.DiseaseAncillaryDto;
import com.supervision.exception.BusinessException;
import com.supervision.model.*;
import com.supervision.model.Process;
import com.supervision.vo.ask.AncillaryItemReqVo;
import com.supervision.vo.ask.AskAncillaryHistoryResVO;
import com.supervision.pojo.vo.AskAncillaryResultReqVO;
import com.supervision.vo.ask.ConfigAncillaryItemResVO;
import com.supervision.service.*;
import com.supervision.util.UserUtil;
import com.supervision.vo.ask.DiagnosisAncillaryRecordVo;
import com.supervision.vo.result.ConfigAncillaryItemVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class AskAncillaryServiceImpl implements AskAncillaryService {

    private final ProcessService processService;

    private final DiseaseAncillaryService diseaseAncillaryService;

    private final ConfigAncillaryItemService ancillaryItemService;

    private final DiagnosisAncillaryRecordService diagnosisAncillaryRecordService;


    @Override
    public List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo) {

        return ancillaryItemService.queryAncillaryItemList(ancillaryItemReqVo);
    }

    @Override
    public DiagnosisAncillaryRecordVo execAskAncillaryResult(AskAncillaryResultReqVO reqVO) {
        // 首先根据process_id查新到流程ID
        Process process = Optional.ofNullable(processService.getById(reqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到流程ID"));

        // 找到对应的项目的检查结果
        DiseaseAncillary diseaseAncillaryQueryBean = new DiseaseAncillary();
        diseaseAncillaryQueryBean.setItemId(reqVO.getItemId());
        diseaseAncillaryQueryBean.setDiseaseId(process.getDiseaseId());
        DiseaseAncillaryDto diseaseAncillary = diseaseAncillaryService.queryDiseaseAncillaryDtoOne(diseaseAncillaryQueryBean, () -> {
            DiseaseAncillaryDto get = new DiseaseAncillaryDto();
            get.setResult("无相关资讯");
            return get;
        });

        DiagnosisAncillaryRecord record = new DiagnosisAncillaryRecord();
        record.setProcessId(process.getId());
        record.setItemId(reqVO.getItemId());
        record.setPrimaryId(reqVO.getPrimaryId());
        record.setAncillaryId(diseaseAncillary.getId());
        record.setResult(diseaseAncillary.getResult());
        record.setCreateUserId(UserUtil.getUser().getId());
        record.setUpdateUserId(UserUtil.getUser().getId());
        record.insert();


        //重组返回结果
        DiagnosisAncillaryRecordVo diagnosisAncillaryRecordVo = new DiagnosisAncillaryRecordVo();
        diagnosisAncillaryRecordVo.setProcessId(record.getProcessId());
        diagnosisAncillaryRecordVo.setItemId(record.getItemId());
        diagnosisAncillaryRecordVo.setAncillaryId(record.getAncillaryId());
        diagnosisAncillaryRecordVo.setResult(record.getResult());
        diagnosisAncillaryRecordVo.setAncillaryName(diseaseAncillary.getItemName());
        return diagnosisAncillaryRecordVo;
    }

    @Override
    public List<AskAncillaryHistoryResVO> queryAskAncillaryHistory(String processId) {
        return diagnosisAncillaryRecordService.queryAncillaryRecord(processId)
                .stream().filter(distinctPredicateNotNull(AskAncillaryHistoryResVO::getItemId)).collect(Collectors.toList());

    }

    public static  <K> Predicate<K> distinctPredicateNotNull(Function<K,Object> function){
        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
        return t-> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true);
    }
}