package com.zd.airbottle.service.impl;

import com.alibaba.fastjson.JSON;
import com.zd.airbottle.domain.QpAirGoodsConfig;
import com.zd.airbottle.domain.QpAirGoogs;
import com.zd.airbottle.domain.dto.QpAirGoodsConfigDto;
import com.zd.airbottle.domain.dto.QpAirGoogsDto;
import com.zd.airbottle.domain.vo.QpAirGoodsConfigVo;
import com.zd.airbottle.domain.vo.QpAirGoogsVo;
import com.zd.airbottle.mapper.QpAirGoogsMapper;
import com.zd.airbottle.service.IQpAirGoodsConfigService;
import com.zd.airbottle.service.IQpAirGoogsService;
import com.zd.common.core.domain.per.PerPrefix;
import com.zd.common.core.utils.DateUtils;
import com.zd.common.core.utils.SecurityUtils;
import com.zd.common.core.utils.bean.TransferUtils;
import com.zd.common.datascope.annotation.DataScope;
import com.zd.common.security.utils.SaveUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 气瓶货物Service业务层处理
 */
@Service
public class QpAirGoogsServiceImpl implements IQpAirGoogsService {
    @Autowired
    private QpAirGoogsMapper qpAirGoogsMapper;
    @Autowired
    private IQpAirGoodsConfigService configService;

    /**
     * 查询气瓶货物
     *
     * @param id 气瓶货物主键
     * @return 气瓶货物
     */
    @Override
    public QpAirGoogs selectQpAirGoogsById(Long id) {
        return qpAirGoogsMapper.selectQpAirGoogsById(id);
    }

    @Override
    public QpAirGoogsVo getById(Long id) {
        QpAirGoogs googs = qpAirGoogsMapper.selectQpAirGoogsById(id);
        QpAirGoogsVo googsVo = new QpAirGoogsVo();
        if (googs!=null){
            BeanUtils.copyProperties(googs, googsVo);
            List<QpAirGoodsConfig> goodsConfigs = configService.selectQpAirGoodsConfigList(new QpAirGoodsConfig().setGoodsId(googs.getId()));
            List<Map<String,Object>> maps=new ArrayList<>();
            if (!goodsConfigs.isEmpty()){
                goodsConfigs.forEach(g->{
                    String detail = g.getDetail();
                    Map<String,Object> map = JSON.parseObject(detail);
                    if (map!=null){
                        map.put("id",g.getId());
                    }
                    maps.add(map);
                });
            }
            googsVo.setMaps(maps);
        }
        return googsVo;
    }

    @Override
    public QpAirGoogsVo getConfigInfo(Long id) {
        QpAirGoogs googs = qpAirGoogsMapper.selectQpAirGoogsById(id);
        QpAirGoogsVo googsVo = new QpAirGoogsVo();
        BeanUtils.copyProperties(googs, googsVo);

        List<QpAirGoodsConfig> goodsConfigs = configService.selectQpAirGoodsConfigList(new QpAirGoodsConfig().setGoodsId(googs.getId()));
        googsVo.setConfigVos(TransferUtils.transferList(goodsConfigs,QpAirGoodsConfigVo.class));
        return googsVo;
    }

    /**
     * 查询气瓶货物列表
     *
     * @param qpAirGoogs 气瓶货物
     * @return 气瓶货物
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u", permi = PerPrefix.AIRBOTTLE_GOOGS)
    public List<QpAirGoogs> selectQpAirGoogsList(QpAirGoogs qpAirGoogs) {
        return qpAirGoogsMapper.selectQpAirGoogsList(qpAirGoogs);
    }

    @Override
    public List<QpAirGoogsVo> list(List<QpAirGoogs> googs) {
        List<QpAirGoodsConfig> goodsConfigs = configService.getListByGoogsIds(googs.stream().map(QpAirGoogs::getId).collect(Collectors.toList()));
        Map<Long, Long> skuCountMap = goodsConfigs.stream().filter(c -> c.getMinValue() != null).collect(Collectors.groupingBy(QpAirGoodsConfig::getGoodsId, Collectors.counting()));

        List<QpAirGoogsVo> googsVos = TransferUtils.transferList(googs, QpAirGoogsVo.class);
        googsVos.forEach(g -> {
            if (skuCountMap.containsKey(g.getId()))
                g.setSkuCount(Math.toIntExact(skuCountMap.get(g.getId())));
        });
        return googsVos;
    }

    /**
     * 新增气瓶货物
     *
     * @param googsDto 气瓶货物
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertQpAirGoogs(QpAirGoogsDto googsDto) {
        QpAirGoogs googs = new QpAirGoogs();
        BeanUtils.copyProperties(googsDto, googs);

        //设置其他公共字段
        SaveUtil.setCommonAttr(googs);
        if (qpAirGoogsMapper.insertQpAirGoogs(googs) > 0) {
            //保存配置详情
            List<QpAirGoodsConfigDto> configDtos = getConfigDtos(googsDto);
            saveOrUpdateConfig(configDtos, googs,  null);
        }
        return 1;
    }

    private void saveOrUpdateConfig(List<QpAirGoodsConfigDto> configDtos, QpAirGoogs googs, List<Long> ids) {
        configDtos.forEach(c -> {
            QpAirGoodsConfig temp = new QpAirGoodsConfig();
            BeanUtils.copyProperties(c, temp);
            Long id = c.getId();
            if (id != null) {
                configService.updateQpAirGoodsConfig(temp);
                if (ids != null)
                    ids.remove(id);
            } else {
                temp.setGoodsId(googs.getId());
                configService.insertQpAirGoodsConfig(temp);
            }
        });
    }

    /**
     * 修改气瓶货物
     *
     * @param qpAirGoogs 气瓶货物
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateQpAirGoogs(QpAirGoogs qpAirGoogs) {
        qpAirGoogs.setUpdateTime(DateUtils.getNowDate());
        qpAirGoogs.setUpdateBy(SecurityUtils.getUsername());
        return qpAirGoogsMapper.updateQpAirGoogs(qpAirGoogs);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public int update(QpAirGoogsDto googsDto) {
        QpAirGoogs googs = new QpAirGoogs();
        BeanUtils.copyProperties(googsDto, googs);

        //设置其他公共字段
        googs.setUpdateTime(DateUtils.getNowDate());
        googs.setUpdateBy(SecurityUtils.getUsername());

        if (qpAirGoogsMapper.updateQpAirGoogs(googs) > 0) {
            List<QpAirGoodsConfig> goodsConfigs = configService.selectQpAirGoodsConfigList(new QpAirGoodsConfig().setGoodsId(googs.getId()));

            List<Long> ids = Collections.synchronizedList(goodsConfigs.stream().map(QpAirGoodsConfig::getId).collect(Collectors.toList()));
            //保存配置详情
            List<QpAirGoodsConfigDto> configDtos = getConfigDtos(googsDto);
            if (!configDtos.isEmpty()) {
                saveOrUpdateConfig(configDtos, googs, ids);
                //删除多余配置项
                if (!ids.isEmpty()) {
                    configService.deleteQpAirGoodsConfigByIds(ids.toArray(new Long[0]));
                }
            }
        }
        return 1;
    }

    private List<QpAirGoodsConfigDto> getConfigDtos(QpAirGoogsDto googsDto) {
        List<Map<String, Object>> maps = googsDto.getMaps();
        List<QpAirGoodsConfigDto> configDtos=new ArrayList<>();
        for (Map<String, Object> map :maps) {
            Integer minValue = (Integer) map.get("minValue");
            Integer bigNum = (Integer) map.get("bigNum");
            StringBuilder nameBuilder=new StringBuilder();
            for (int i = 0; i <= bigNum; i++) {
                nameBuilder.append(map.get("name" + i));
                if (i!=bigNum){
                    nameBuilder.append("-");
                }
            }
            String name= nameBuilder.toString();
            QpAirGoodsConfigDto configDto=new QpAirGoodsConfigDto().setMinValue(BigDecimal.valueOf(minValue)).setName(name).setDetail(JSON.toJSONString(map));
            Object o = map.get("id");
            if (o!=null){
                Long id = Long.valueOf((Integer)o) ;
                configDto.setId(id);
            }
            configDtos.add(configDto);
        }
        return configDtos;
    }

    /**
     * 批量删除气瓶货物
     *
     * @param ids 需要删除的气瓶货物主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteQpAirGoogsByIds(Long[] ids) {
        configService.deleteByGoogsIds(ids);
        return qpAirGoogsMapper.deleteQpAirGoogsByIds(ids);
    }

    /**
     * 删除气瓶货物信息
     *
     * @param id 气瓶货物主键
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteQpAirGoogsById(Long id) {
        return qpAirGoogsMapper.deleteQpAirGoogsById(id);
    }
}
