package com.kcim.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kcim.common.exception.CostException;
import com.kcim.common.util.BeanUtil;
import com.kcim.common.util.PageUtils;
import com.kcim.common.util.UserContext;
import com.kcim.dao.mapper.CostShareLevelMapper;
import com.kcim.dao.model.CostShareLevel;
import com.kcim.dao.model.dto.CostShareLevelEditDto;
import com.kcim.dao.model.dto.CostShareLevelSaveDto;
import com.kcim.vo.CostShareLevelVO;
import com.kcim.service.CostShareLevelService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;


@Service("costShareLevelService")
public class CostShareLevelServiceImpl extends ServiceImpl<CostShareLevelMapper, CostShareLevel> implements CostShareLevelService {


    /**
     * 分页查询相关分摊层级信息
     *
     * @param current
     * @param pageSize
     * @param name
     * @param hospId
     * @return
     */
    @Override
    public PageUtils queryList(Integer current, Integer pageSize, String name, Long hospId) {
        Page<CostShareLevel> costShareLevelPage = new Page<>(current, pageSize);
        Page<CostShareLevel> pages = this.page(costShareLevelPage, new QueryWrapper<CostShareLevel>().lambda()
                .eq(!StringUtils.isEmpty(hospId), CostShareLevel::getHospId, hospId)
                .like(!StringUtils.isEmpty(name), CostShareLevel::getShareName, name)
                .orderByAsc(CostShareLevel::getLeverSort));
        List<CostShareLevel> costShareLevelList = pages.getRecords();
        List<CostShareLevelVO> costShareLevelVOList = BeanUtil.convertList(costShareLevelList, CostShareLevelVO.class);
        int max=costShareLevelVOList.size();
        costShareLevelVOList.forEach(i->{
            i.setMaxLevel(max);
        });
        PageUtils pageUtils = new PageUtils(pages);
        pageUtils.setList(costShareLevelVOList);
        return pageUtils;
    }

    /**
     * 保存
     *
     * @param costShareLevelSaveDto
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void addCostShareLevel(CostShareLevelSaveDto costShareLevelSaveDto) {
        Long hospId = UserContext.getHospId();
        // 检验目标层级必须大于等于当前层级
        String targetLevel = costShareLevelSaveDto.getTargetLevel();
        Integer leverSort = costShareLevelSaveDto.getLeverSort();
        checkTargetLevel(targetLevel, leverSort);
        CostShareLevel costShareLevel = BeanUtil.convertObj(costShareLevelSaveDto, CostShareLevel.class);
        costShareLevel.setCreateTime(System.currentTimeMillis());
        costShareLevel.setHospId(hospId);
        baseMapper.insert(costShareLevel);
    }
    /**
     * 查询层级级别大于等于当前
     */
    /**
     * 修改分摊层级数据
     *
     * @param costShareLevelEditDto
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void updateByCostShareLevel(CostShareLevelEditDto costShareLevelEditDto) {
        Long hospId = UserContext.getHospId();
        Long id = costShareLevelEditDto.getId();
        CostShareLevel costShareLevel = baseMapper.selectById(id);
        if (Objects.isNull(costShareLevel)){
            throw new CostException("分摊层级数据不存在");
        }
        String targetLevel = costShareLevelEditDto.getTargetLevel();
        Integer leverSort = costShareLevelEditDto.getLeverSort();
        checkTargetLevel(targetLevel, leverSort);
//        baseMapper.deleteById(id);
//        CostShareLevel costShareLevelRequest = BeanUtil.convertObj(costShareLevelEditDto, CostShareLevel.class);
//        costShareLevelRequest.setId(null);
//        costShareLevelRequest.setCreateTime(System.currentTimeMillis());
//        costShareLevelRequest.setHospId(hospId);
//        baseMapper.insert(costShareLevelRequest);
        BeanUtil.convertObj(costShareLevelEditDto, costShareLevel);
        baseMapper.updateById(costShareLevel);
    }

    /**
     *  目标层级不能小于当前层级
     * @param targetLevel 目标层级
     * @param leverSort 当前层级
     */
    private void checkTargetLevel(String targetLevel, Integer leverSort) {
        List<Integer> targetLevelList = Arrays.stream(targetLevel.split(StrUtil.COMMA)).map(Integer::valueOf).collect(Collectors.toList());
        targetLevelList.forEach(i -> {
            if (i < leverSort) {
                throw new CostException(500, "目标层级不能小于当前层级");
            }
        });
    }

    /**
     * 获取所有的分摊层级数据
     *
     * @param hospId
     * @return
     */
    @Override
    public List<CostShareLevelVO> getAll(Long hospId) {
        QueryWrapper<CostShareLevel> wrapper = new QueryWrapper<>();
        wrapper.eq(!StringUtils.isEmpty(hospId), "hosp_id", hospId).orderByAsc("lever_sort");
        List<CostShareLevel> costShareLevels = baseMapper.selectList(wrapper);
        List<CostShareLevelVO> costShareLevelVOList = BeanUtil.convertList(costShareLevels, CostShareLevelVO.class);
        return costShareLevelVOList;
    }

    /**
     * 通过分摊层级序号得到分摊层级列表
     *
     * @param targetLevelList 分摊层级序号列表
     * @param hospId 医院id
     * @return CostShareLevel List
     */
    @Override
    public List<CostShareLevel> getListByLevelSort(ArrayList<String> targetLevelList, Long hospId) {
        return this.list(
                new LambdaQueryWrapper<CostShareLevel>()
                        .in(CostShareLevel::getLeverSort, targetLevelList)
                        .eq(CostShareLevel::getHospId, hospId)
        );
    }

    @Override
    public List<Long> getMaxId(Long hospId) {
        List<Long> ids = baseMapper.getMaxIds(hospId);
        return ids;
    }

    /**
     * 删除分摊等级的数据
     *
     * @param idList 分摊层级的id
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void deleteByIds(List<Integer> idList) {
        this.removeByIds(idList);
    }
}