package com.fzm.mall.server.admin.distribution.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.mall.server.admin.constant.MallResponseError;
import com.fzm.mall.server.admin.distribution.entity.dto.TemplateDTO;
import com.fzm.mall.server.admin.distribution.entity.dto.TemplateSaveDTO;
import com.fzm.mall.server.admin.distribution.entity.dto.TemplateUpdateDTO;
import com.fzm.mall.server.admin.distribution.mapper.TemplateMapper;
import com.fzm.mall.server.admin.distribution.model.Template;
import com.fzm.mall.server.admin.distribution.model.TemplateItem;
import com.fzm.mall.server.admin.distribution.service.ITemplateItemService;
import com.fzm.mall.server.admin.distribution.service.ITemplateService;
import com.fzm.mall.server.admin.exception.MyException;
import com.fzm.mall.server.admin.util.CopyUtil;
import com.fzm.mall.server.admin.util.UUIDUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 物流中心-运费模板 服务实现类
 * </p>
 *
 * @author wulixian
 * @since 2021-03-04
 */
@Service
@Transactional
public class TemplateServiceImpl extends ServiceImpl<TemplateMapper, Template> implements ITemplateService {

    @Resource
    private TemplateMapper templateMapper;

    @Resource
    private ITemplateItemService templateItemService;

    @Override
    public void save(TemplateSaveDTO templateSaveDTO) {
        Template template = CopyUtil.to(templateSaveDTO, Template.class);
        template.setTemplateId(UUIDUtil.getUUID());

        templateMapper.insert(template);

        template.saveBatchItem(templateItemService, template);
    }

    @Override
    public void update(TemplateUpdateDTO templateUpdateDTO) {
        Template template = CopyUtil.to(templateUpdateDTO, Template.class);
        UpdateWrapper<Template> wrapper = new UpdateWrapper<>();
        wrapper.eq("template_id", template.getTemplateId())
                .eq("merchant_id", template.getMerchantId())
                .eq("update_time", template.getUpdateTime());

        int update = templateMapper.update(template, wrapper);
        if (update == 0) {
            throw new MyException(MallResponseError.UPDATE_FAIL);
        }

        template.updateItem(templateItemService, template);
    }

    @Override
    public void delete(String templateId, String merchantId) {
        QueryWrapper<Template> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("template_id", templateId)
                .eq("merchant_id", merchantId);
        templateMapper.delete(queryWrapper);

        QueryWrapper<TemplateItem> itemQueryWrapper = new QueryWrapper<>();
        itemQueryWrapper.eq("template_id", templateId)
                .eq("merchant_id", merchantId);
        templateItemService.remove(itemQueryWrapper);
    }

    @Override
    public TemplateDTO read(String templateId, String merchantId) {
        Template template = templateMapper.read(templateId, merchantId);

        if (template != null) {
            template.listItem(templateItemService, templateId, merchantId);
        }

        return CopyUtil.to(template, TemplateDTO.class);
    }

    @Override
    public List<TemplateDTO> list(String merchantId) {
        List<Template> templateList = templateMapper.list(merchantId);

        if (CollectionUtils.isNotEmpty(templateList)) {
            templateList.forEach(template -> {
                template.listItem(templateItemService, template.getTemplateId(), merchantId);
            });
        }
        return CopyUtil.toList(templateList, TemplateDTO.class);
    }

    @Override
    public Template getByTemplateId(String templateId) {
        QueryWrapper<Template> qw = new QueryWrapper<>();
        qw.lambda().eq(Template::getTemplateId, templateId);
        return getOne(qw);
    }

    @Override
    public Template getByMerchantId(String merchantId) {
        QueryWrapper<Template> qw = new QueryWrapper<>();
        qw.lambda().eq(Template::getMerchantId, merchantId);
        return getOne(qw);
    }
}
