package com.eitc.patient.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eitc.common.core.domain.AjaxResult;
import com.eitc.common.utils.SecurityUtils;
import com.eitc.patient.domain.DiagnosisTypeOrderDoctor;
import com.eitc.patient.dto.DiagnosisTypeOrderDoctorDto;
import com.eitc.patient.mapper.DiagnosisTypeOrderDoctorMapper;
import com.eitc.patient.service.IDiagnosisTypeOrderDoctorService;
import com.eitc.patient.tree.DiagnosisTypeTree;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * DiagnosisTypeOrderDoctorServiceImpl
 *
 * @author mtx
 * @date: 2024/05/17 15:39
 */
@Service
public class DiagnosisTypeOrderDoctorServiceImpl extends ServiceImpl<DiagnosisTypeOrderDoctorMapper, DiagnosisTypeOrderDoctor> implements IDiagnosisTypeOrderDoctorService {


    /**
     * 保存分类排序
     *
     * @param treeList 树
     * @return 返回结果
     * @author mtx
     * @date: 2024/7/10 14:12
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveTree(List<DiagnosisTypeTree> treeList) {
        String userId = String.valueOf(SecurityUtils.getUserId());
        this.baseMapper.removeDoctorId(userId);

        saveTree(treeList, "0");
        return AjaxResult.success();
    }

    /**
     * 查询分类排序
     *
     * @param doctorId 医生id
     * @return 返回结果
     * @author mtx
     * @date: 2024/7/10 14:12
     */
    @Override
    public List<DiagnosisTypeOrderDoctorDto> findListByDoctorId(String doctorId) {
        return this.baseMapper.findListByDoctorId(doctorId);
    }

    /**
     * 保存诊断类型树结构到诊断类型医生订单表中。
     * 该方法通过递归方式遍历诊断类型树，为每个节点创建相应的诊断类型医生订单条目。
     *
     * @param treeList 诊断类型树列表，包含需要保存的树结构。
     * @param parentId 当前节点的父节点ID，用于建立节点间的层级关系。
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveTree(List<DiagnosisTypeTree> treeList, String parentId) {
        // 检查列表是否为空，如果为空则直接返回，避免不必要的操作。
        if (CollectionUtils.isEmpty(treeList)) {
            return;
        }
        // 初始化计数器，用于为每个节点分配顺序编号。
        AtomicInteger num = new AtomicInteger(1);
        // 遍历诊断类型树列表中的每个节点。
        for (DiagnosisTypeTree diagnosisTypeTree : treeList) {
            // 创建一个新地诊断类型医生订单条目。
            DiagnosisTypeOrderDoctor entry = new DiagnosisTypeOrderDoctor();
            // 设置医生ID，基于当前登录用户的ID。
            entry.setDoctorId(String.valueOf(SecurityUtils.getUserId()));
            // 设置诊断类型ID，基于当前节点的ID。
            entry.setDiagnosisTypeId(diagnosisTypeTree.getId());
            // 设置订单编号，基于计数器的值。
            entry.setOrderNum(num.getAndIncrement());
            // 设置父ID，基于方法参数提供的父节点ID。
            entry.setParentId(parentId);
            // 保存当前条目到数据库。
            this.save(entry);
            // 递归调用当前方法，处理当前节点的子节点，传入当前节点的ID作为新的父ID。
            saveTree(diagnosisTypeTree.getChildrenList(), entry.getId());
        }
    }
}
