package com.bonus.zlpt.equip.service.impl;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import com.bonus.zlpt.common.core.utils.DateUtils;
import com.bonus.zlpt.equip.api.domain.TypeInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bonus.zlpt.equip.mapper.TypeInfoMapper;
import com.bonus.zlpt.equip.service.ITypeInfoService;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;

/**
 * 设备类型Service业务层处理
 * 
 * @author xsheng
 * @date 2023-12-02
 */
@Service
public class TypeInfoServiceImpl implements ITypeInfoService 
{
    @Resource
    private TypeInfoMapper typeInfoMapper;

    /**
     * 查询设备类型
     * 
     * @param typeId 设备类型主键
     * @return 设备类型
     */
    @Override
    public TypeInfo selectTypeInfoByTypeId(Long typeId)
    {
        return typeInfoMapper.selectTypeInfoByTypeId(typeId);
    }

    /**
     * 查询设备类型列表
     * 
     * @param typeInfo 设备类型
     * @return 设备类型
     */
    @Override
    public List<TypeInfo> selectTypeInfoList(TypeInfo typeInfo)
    {
        if (typeInfo == null || typeInfo.getTypeId()==null){
            typeInfo = new TypeInfo();
            typeInfo.setTypeId(0L);
        }
        return typeInfoMapper.selectTypeList(typeInfo);
    }

    /**
     * 新增设备类型
     * 
     * @param typeInfo 设备类型
     * @return 结果
     */
    @Override
    public int insertTypeInfo(TypeInfo typeInfo)
    {
        typeInfo.setCreateTime(DateUtils.getNowDate());
        return typeInfoMapper.insertTypeInfo(typeInfo);
    }

    /**
     * 修改设备类型
     * 
     * @param typeInfo 设备类型
     * @return 结果
     */
    @Override
    public int updateTypeInfo(TypeInfo typeInfo)
    {
        typeInfo.setUpdateTime(DateUtils.getNowDate());
        return typeInfoMapper.updateTypeInfo(typeInfo);
    }

    /**
     * 批量删除设备类型
     * 
     * @param typeIds 需要删除的设备类型主键
     * @return 结果
     */
    @Override
    public int deleteTypeInfoByTypeIds(Long[] typeIds)
    {
        return typeInfoMapper.deleteTypeInfoByTypeIds(typeIds);
    }

    /**
     * 删除设备类型信息
     * 
     * @param typeId 设备类型主键
     * @return 结果
     */
    @Override
    public int deleteTypeInfoByTypeId(Long typeId)
    {
        if(typeInfoMapper.selectCountByTypeId(typeId)>0){
            return 0;
        }
        return typeInfoMapper.deleteTypeInfoByTypeId(typeId);
    }

    /**
     * 获取树结构
     * @return
     */
    @Override
    public List<Tree<Long>> treeSelect() {

        List<TreeNode<Long>> collect = typeInfoMapper.selectTypeInfoList(new TypeInfo())
                .stream().map(getNodeFunction()).collect(Collectors.toList());

        return TreeUtil.build(collect,0L);
    }


    @NotNull
    private Function<TypeInfo, TreeNode<Long>> getNodeFunction() {

        return typeInfo -> {
            TreeNode<Long> node = new TreeNode<>();
            node.setId(typeInfo.getTypeId());
            node.setName(typeInfo.getTypeName());
            node.setParentId(typeInfo.getParentId());
            node.setWeight(typeInfo.getSort());
            return node;
        };
    }
}
