package com.ylcm.sys.service.impl;

import com.ylcm.sys.domain.AdMedia;
import com.ylcm.sys.domain.AdSpecial;
import com.ylcm.sys.domain.AdTheatre;
import com.ylcm.sys.excel.model.AdMediaImportDTO;
import com.ylcm.sys.exception.BaseException;
import com.ylcm.sys.form.AdMediaForm;
import com.ylcm.sys.mapper.AdMediaMapper;
import com.ylcm.sys.mapper.AdSpecialMapper;
import com.ylcm.sys.mapper.AdTheatreMapper;
import com.ylcm.sys.service.AdMediaService;
import com.ylcm.sys.service.AdSpecialService;
import com.ylcm.sys.service.AdTheatreService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * <p>
 * 媒体管理表 服务实现类
 * </p>
 *
 * @author admin
 * @since 2020-07-01
 */
@Service
public class AdMediaServiceImpl extends ServiceImpl<AdMediaMapper, AdMedia> implements AdMediaService {

	@Resource
	private AdSpecialMapper adSpecialMapper;
	@Resource
	private AdTheatreMapper adTheatreMapper;
	@Resource
	private AdSpecialService adSpecialService;
	@Resource
	private AdTheatreService adTheatreService;
	@Resource
	private AdMediaMapper adMediaMapper;
	
	@Override
	public AdMedia getByName(String name) {
		LambdaQueryWrapper<AdMedia> queryWrapper = new LambdaQueryWrapper<AdMedia>().eq(AdMedia::getName, name)
				                                                                    .last("LIMIT 1");
		AdMedia adMedia = baseMapper.selectOne(queryWrapper);
		return adMedia;
	}

	@Transactional(rollbackFor = Exception.class)
	@Override
	public String importBatch(List<AdMediaImportDTO> importDTOs) {
		int index = 2; //表格从第二行开始
		for (AdMediaImportDTO adMediaImportDTO : importDTOs) {
			index ++;
			AdMedia adMedia = adMediaImportDTO.toMedia();
			AdMedia oldAdMedia = getByName(adMedia.getName());
			if (oldAdMedia != null) {
				throw new BaseException("第"+ index + "行，重复媒体名称");
			}
			baseMapper.insert(adMedia);
		}
		return "ok";
	}

	@Override
	public Integer getTotalByName(String name) {
		LambdaQueryWrapper<AdMedia> queryWrapper = new LambdaQueryWrapper<AdMedia>();
		if(StringUtils.isNotBlank(name)) {
			queryWrapper.like(AdMedia::getName, name);
		}
		return baseMapper.selectCount(queryWrapper);
	}

	@Override
	public String deleteById(Integer id) {
	    AdMedia adMedia = getById(id);

		AdSpecial adSpecial = adSpecialMapper.selectOne(
				new LambdaQueryWrapper<AdSpecial>().eq(AdSpecial::getMediaName, adMedia.getName()).last("limit 1"));
		if (adSpecial != null) {
			return "该媒体在专题中使用不能删除";
		}
		AdTheatre adTheatre = adTheatreMapper.selectOne(
				new LambdaQueryWrapper<AdTheatre>().eq(AdTheatre::getMediaName, adMedia.getName()).last("limit 1"));
		if (adTheatre != null) {
			return "该媒体在剧场中使用不能删除";
		}
		baseMapper.deleteById(id);
		return null;
	}

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateByForm(AdMediaForm adMediaForm) {
        AdMedia adMedia = getById(adMediaForm.getId());
        if (!adMedia.getName().equals(adMediaForm.getName())) {
            adSpecialService.updateMediaName(adMedia.getName(), adMediaForm.getName());
            adTheatreService.updateMediaName(adMedia.getName(), adMediaForm.getName());
        }
        AdMedia upAdMedia = new AdMedia();
        BeanUtils.copyProperties(adMediaForm, upAdMedia);
        this.updateById(upAdMedia);
    }

	@Override
	public List<AdMedia> getListByPage(String name, Integer rank, Integer pageSize, Integer pageNo) {
		pageSize = pageSize == null ? 10 : pageSize;
		if (pageNo != null){
			pageNo = (pageNo - 1) * pageSize;
		}
		return adMediaMapper.getListByPage(name, rank, pageSize, pageNo);
	}
}
