package cn.iocoder.yudao.module.system.service.nursing;

import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ItemPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.NurseItemDO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.NursingCategoryDO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.dal.mysql.biz.NurseItemMapper;
import cn.iocoder.yudao.module.system.dal.mysql.biz.NursingCategoryMapper;
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class NurseItemServiceImpl implements NurseItemService {

    @Resource
    private NurseItemMapper nurseItemMapper;
    @Resource
    private NursingCategoryMapper categoryMapper;
    @Resource
    private TenantMapper tenantMapper;

    @Override
    public void addNurseItem(NurseItemDO itemDO) {
        nurseItemMapper.insert(itemDO);
    }

    @Override
    public void editNurseItem(NurseItemDO nurseItemDO) {
        nurseItemMapper.updateById(nurseItemDO);
    }

    @Override
    public NurseItemDO getDetail(Long itemId) {
        return nurseItemMapper.selectById(itemId);
    }

    @Override
    public void delete(Long itemId) {
        nurseItemMapper.deleteById(itemId);
    }

    @Override
    public PageResult<NurseItemDO> queryPage(ItemPageReqVO pageReqVO) {
        PageResult<NurseItemDO> pageResult = nurseItemMapper.selectPage(pageReqVO);
        for (NurseItemDO itemDO : pageResult.getList()) {
            TenantDO tenantDO = tenantMapper.selectById(itemDO.getTenantId());
            itemDO.setTenantName(tenantDO.getName());
        }
        return pageResult;
    }

    @Override
    public void move(NurseItemDO nurseItemDO) {
        List<Long> moveIds = nurseItemDO.getMoveIds();
        if (CollectionUtil.isNotEmpty(moveIds)) {
            for (Long itemId : moveIds) {
                NurseItemDO item = nurseItemMapper.selectById(itemId);
                if (item != null) {
                    item.setCategoryId(nurseItemDO.getCategoryId());
                    nurseItemMapper.updateById(item);
                }
            }
        }
    }

    @Override
    public List<NursingCategoryDO> getParentCategoryList(Long tenantId) {
        List<NursingCategoryDO> parentList = categoryMapper.selectList(new LambdaQueryWrapperX<NursingCategoryDO>().eq(NursingCategoryDO::getParentId, 0)
                .eq(NursingCategoryDO::getTenantId,tenantId));

        for (NursingCategoryDO nursingCategoryDO : parentList) {
            //查询每个一级分类下面的所有子分类
            List<Long> subIds = new ArrayList<>();
            getSubcategories(nursingCategoryDO.getId(),subIds);
            List<List<NurseItemDO>> itemCollect = subIds.stream().map(item -> nurseItemMapper.selectList(new LambdaQueryWrapperX<NurseItemDO>().eq(NurseItemDO::getCategoryId, item).eq(NurseItemDO::getStatus,1))).collect(Collectors.toList());
            List<NurseItemDO> collect = itemCollect.stream().flatMap(List::stream).collect(Collectors.toList());
            for (NurseItemDO itemDO : collect) {
                itemDO.setCategoryName(categoryMapper.selectById(itemDO.getCategoryId()).getCategoryName());
            }
            nursingCategoryDO.setItems(collect);
        }
        return parentList;
    }


    public void getSubcategories(Long parentId,List<Long> subIds) {
        List<NursingCategoryDO> categoryList = categoryMapper.selectList(new LambdaQueryWrapperX<NursingCategoryDO>().eq(NursingCategoryDO::getParentId, parentId));
        if (CollectionUtil.isNotEmpty(categoryList)){
            for (NursingCategoryDO nursingCategoryDO : categoryList) {
                subIds.add(nursingCategoryDO.getId());
                getSubcategories(nursingCategoryDO.getId(),subIds);
            }
        }
    }
}
