package com.zd.airbottle.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.zd.airbottle.domain.vo.QpAirBottleConfigVo;
import com.zd.airbottle.domain.vo.QpAirBottleRVo;
import com.zd.airbottle.domain.vo.QpAirGoodsConfigVo;
import com.zd.airbottle.service.IQpAirBottleService;
import com.zd.airbottle.service.IQpAirGoodsConfigService;
import com.zd.common.core.utils.bean.TransferUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zd.airbottle.mapper.QpAirBottleConfigMapper;
import com.zd.airbottle.domain.QpAirBottleConfig;
import com.zd.airbottle.service.IQpAirBottleConfigService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 气瓶配置Service业务层处理
 *
 * @author zd
 * @date 2022-05-17
 */
@Service
public class QpAirBottleConfigServiceImpl implements IQpAirBottleConfigService {
    @Autowired
    private QpAirBottleConfigMapper qpAirBottleConfigMapper;

    @Autowired
    private IQpAirGoodsConfigService goodsConfigService;

    @Autowired
    private IQpAirBottleService bottleService;

    /**
     * 查询气瓶配置
     *
     * @param id 气瓶配置主键
     * @return 气瓶配置
     */
    @Override
    public QpAirBottleConfig selectQpAirBottleConfigById(Long id) {
        return qpAirBottleConfigMapper.selectQpAirBottleConfigById(id);
    }

    /**
     * 查询气瓶配置列表
     *
     * @param qpAirBottleConfig 气瓶配置
     * @return 气瓶配置
     */
    @Override
    public List<QpAirBottleConfig> selectQpAirBottleConfigList(QpAirBottleConfig qpAirBottleConfig) {
        return qpAirBottleConfigMapper.selectQpAirBottleConfigList(qpAirBottleConfig);
    }

    /**
     * 新增气瓶配置
     *
     * @param qpAirBottleConfig 气瓶配置
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertQpAirBottleConfig(QpAirBottleConfig qpAirBottleConfig) {
        return qpAirBottleConfigMapper.insertQpAirBottleConfig(qpAirBottleConfig);
    }

    /**
     * 修改气瓶配置
     *
     * @param qpAirBottleConfig 气瓶配置
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateQpAirBottleConfig(QpAirBottleConfig qpAirBottleConfig) {
        return qpAirBottleConfigMapper.updateQpAirBottleConfig(qpAirBottleConfig);
    }

    /**
     * 批量删除气瓶配置
     *
     * @param ids 需要删除的气瓶配置主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteQpAirBottleConfigByIds(Long[] ids) {
        return qpAirBottleConfigMapper.deleteQpAirBottleConfigByIds(ids);
    }

    /**
     * 删除气瓶配置信息
     *
     * @param id 气瓶配置主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteQpAirBottleConfigById(Long id) {
        return qpAirBottleConfigMapper.deleteQpAirBottleConfigById(id);
    }

    /**
     * 根据气瓶ID集合批量查询气瓶配置
     *
     * @param bottleIds 气瓶ID集合
     * @return 气瓶配置集合
     */
    @Override
    public List<QpAirBottleConfig> getByBottleIds(List<Long> bottleIds) {
        if (bottleIds.isEmpty())
            return new ArrayList<>();
        return qpAirBottleConfigMapper.getByBottleIds(bottleIds);
    }

    @Override
    public List<QpAirBottleConfig> getByBottleId(Long bottleId) {
        return qpAirBottleConfigMapper.getByBottleId(bottleId);
    }

    @Override
    public List<QpAirBottleConfigVo> getByIds(List<Long> ids) {
        List<QpAirBottleConfig> bottleConfigs = qpAirBottleConfigMapper.getByIds(ids);
        List<QpAirBottleConfigVo> configVos = TransferUtils.transferList(bottleConfigs, QpAirBottleConfigVo.class);
        List<QpAirGoodsConfigVo> goodsConfigVos = goodsConfigService.getByIds(configVos.stream().map(QpAirBottleConfigVo::getConfigId).collect(Collectors.toList()));

        //获取供应商气瓶信息
        List<QpAirBottleRVo> bottleRVos = bottleService.getByIds(configVos.stream().map(QpAirBottleConfigVo::getBottleId).collect(Collectors.toList()));

        Map<Long, QpAirBottleRVo> bottleRVoMap = bottleRVos.stream().collect(Collectors.toMap(QpAirBottleRVo::getId, b -> b));

        Map<Long, QpAirGoodsConfigVo> goodsConfigVoMap = goodsConfigVos.stream().collect(Collectors.toMap(QpAirGoodsConfigVo::getId, g -> g));
        configVos.forEach(c->{
            Long configId = c.getConfigId();
            if (goodsConfigVoMap.containsKey(configId)){
                QpAirGoodsConfigVo configVo = goodsConfigVoMap.get(configId);
                c.setConfigName(configVo.getName());
            }
            Long bottleId = c.getBottleId();
            if (bottleRVoMap.containsKey(bottleId)){
                QpAirBottleRVo bottleRVo = bottleRVoMap.get(bottleId);
                c.setCompanyName(bottleRVo.getCompanyName())
                        .setAirName(bottleRVo.getAirName())
                        .setAirConstituents(bottleRVo.getAirConstituents());
            }
        });
        return configVos;
    }
}
