package com.eitc.patient.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eitc.patient.domain.DiagnosisTypeCostProject;
import com.eitc.patient.mapper.DiagnosisTypeCostProjectMapper;
import com.eitc.patient.service.IDiagnosisTypeCostProjectService;
import com.eitc.patient.vo.CollectCostDetailsVO;
import com.eitc.patient.vo.DiagnosisTypeCostProjectInfoVO;
import com.eitc.patient.vo.DiagnosisTypeCostProjectVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * DiagnosisTypeCostProjectServiceImpl
 *
 * @author mtx
 * @date: 2024/05/17 15:39
 */
@Service
public class DiagnosisTypeCostProjectServiceImpl extends ServiceImpl<DiagnosisTypeCostProjectMapper, DiagnosisTypeCostProject> implements IDiagnosisTypeCostProjectService {

    /**
     * 查询收费分类详情列表
     *
     * @param entry 收费分类详情
     * @return 收费分类详情集合
     */
    @Override
    public List<DiagnosisTypeCostProjectInfoVO> findList(DiagnosisTypeCostProjectInfoVO entry) {
        return this.baseMapper.findList(entry);
    }

    /**
     * 保存诊断分类收费项目
     * 该方法首先验证传入的收费项目详情列表是否为空，然后遍历列表，为每个收费项目创建诊断类型收费项目对象，
     * 并设置相关属性。如果收费项目详情的ID为空，则抛出异常。在所有诊断类型收费项目对象创建完毕后，
     * 先删除原有的同诊断类型ID的收费项目，然后批量保存新的诊断类型收费项目。
     *
     * @param vo 保存诊断分类收费项目的参数对象，包含诊断类型ID和收费项目详情列表
     * @author mtx
     * @date 2024/7/22 16:41
     */
    @Override
    @Transactional
    public void add(DiagnosisTypeCostProjectVO vo) {
        // 获取诊断类型ID
        String diagnosisTypeId = vo.getDiagnosisTypeId();
        // 获取收费项目详情列表
        List<CollectCostDetailsVO> voList = vo.getCollectCostDetailsVOList();

        // 验证收费项目详情列表是否为空，为空则抛出异常
        if (CollectionUtils.isEmpty(voList)) {
            throw new RuntimeException("收费分类详情不能为空");
        }

        // 初始化诊断类型收费项目列表
        List<DiagnosisTypeCostProject> list = new ArrayList<>();
        // 遍历收费项目详情列表
        for (CollectCostDetailsVO collectCostDetailsVO : voList) {
            // 获取收费项目详情ID
            String id = collectCostDetailsVO.getId();
            // 验证收费项目详情ID是否为空，为空则抛出异常
            if (StringUtils.isBlank(id)) {
                throw new RuntimeException("收费分类详情ID不能为空");
            }

            // 创建诊断类型收费项目对象
            DiagnosisTypeCostProject diagnosisTypeCostProject = new DiagnosisTypeCostProject();
            // 设置诊断类型ID
            diagnosisTypeCostProject.setDiagnosisTypeId(diagnosisTypeId);
            // 设置收费项目详情ID
            diagnosisTypeCostProject.setCollectCostDetailsId(id);
            // 设置总数，如果总数为空，则默认为1
            diagnosisTypeCostProject.setTotal(Objects.isNull(collectCostDetailsVO.getTotal()) ? 1 : collectCostDetailsVO.getTotal());
            // 将诊断类型收费项目对象添加到列表
            list.add(diagnosisTypeCostProject);
        }

        // 删除原有的同诊断类型ID的诊断类型收费项目
        this.remove(Wrappers.<DiagnosisTypeCostProject>lambdaQuery().eq(DiagnosisTypeCostProject::getDiagnosisTypeId, diagnosisTypeId));
        // 批量保存新的诊断类型收费项目
        this.saveBatch(list);
    }

}
