package com.xunhong.erp.turbo.biz.infrastructure.gateway;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerRebateCustomerCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerRebateCustomerDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.DealerRebateCustomerUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerRebateCustomerListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerRebateCustomerPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.DealerRebateCustomerShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.DealerRebateCustomer;
import com.xunhong.erp.turbo.biz.domain.gateway.DealerRebateCustomerGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.DealerRebateCustomerConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.DealerDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.DealerRebateCustomerDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.DealerMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.DealerRebateCustomerMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author shenyifei
 */
@Repository
@RequiredArgsConstructor
public class DealerRebateCustomerGatewayImpl implements DealerRebateCustomerGateway {
	private final DealerRebateCustomerMapper dealerRebateCustomerMapper;
	private final DealerMapper dealerMapper;
	private final DealerRebateCustomerConvert dealerRebateCustomerConvert;

	@Override
	public DealerRebateCustomer save(DealerRebateCustomerCreateCmd dealerRebateCustomerCreateCmd) {
		DealerRebateCustomerDO dealerRebateCustomerDO = dealerRebateCustomerConvert.toDealerRebateCustomerDO(dealerRebateCustomerCreateCmd);
		dealerRebateCustomerMapper.insert(dealerRebateCustomerDO);

		return dealerRebateCustomerConvert.toDealerRebateCustomer(dealerRebateCustomerDO);
	}

	@Override
	public IPage<DealerRebateCustomer> page(DealerRebateCustomerPageQry dealerRebateCustomerPageQry) {
		LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerPageQry.getDealerId()), DealerRebateCustomerDO::getDealerId, dealerRebateCustomerPageQry.getDealerId());
		queryWrapper.like(StrUtil.isNotBlank(dealerRebateCustomerPageQry.getName()), DealerRebateCustomerDO::getName, dealerRebateCustomerPageQry.getName());
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerPageQry.getStatus()), DealerRebateCustomerDO::getStatus, dealerRebateCustomerPageQry.getStatus());
		queryWrapper.orderByDesc(DealerRebateCustomerDO::getCreatedAt);

		IPage<DealerRebateCustomerDO> page = new Page<>(dealerRebateCustomerPageQry.getPageIndex(), dealerRebateCustomerPageQry.getPageSize());
		page = dealerRebateCustomerMapper.selectPage(page, queryWrapper);

		List<Long> dealerIdList = page.getRecords().stream().map(DealerRebateCustomerDO::getDealerId).toList();
		if (CollUtil.isNotEmpty(dealerIdList)) {
			LambdaQueryWrapper<DealerDO> queryWrapper1 = Wrappers.lambdaQuery(DealerDO.class);
			queryWrapper1.in(DealerDO::getDealerId, dealerIdList);
			List<DealerDO> dealerDOList = dealerMapper.selectList(queryWrapper1);
			Map<Long, DealerDO> dealerDOMap = dealerDOList.stream().collect(Collectors.toMap(DealerDO::getDealerId, Function.identity()));
			page.getRecords().forEach(dealerRebateCustomerDO -> dealerRebateCustomerDO.setDealerDO(dealerDOMap.get(dealerRebateCustomerDO.getDealerId())));
		}

		return page.convert(dealerRebateCustomerConvert::toDealerRebateCustomer);
	}

	@Override
	public List<DealerRebateCustomer> list(DealerRebateCustomerListQry dealerRebateCustomerListQry) {
		LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerListQry.getDealerId()), DealerRebateCustomerDO::getDealerId, dealerRebateCustomerListQry.getDealerId());
		queryWrapper.like(StrUtil.isNotBlank(dealerRebateCustomerListQry.getName()), DealerRebateCustomerDO::getName, dealerRebateCustomerListQry.getName());
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerListQry.getStatus()), DealerRebateCustomerDO::getStatus, dealerRebateCustomerListQry.getStatus());

		queryWrapper.orderByDesc(DealerRebateCustomerDO::getCreatedAt);
		List<DealerRebateCustomerDO> dealerRebateCustomerDOList = dealerRebateCustomerMapper.selectList(queryWrapper);
		return dealerRebateCustomerDOList.stream().map(dealerRebateCustomerConvert::toDealerRebateCustomer).toList();
	}

	@Override
	public DealerRebateCustomer update(DealerRebateCustomerUpdateCmd dealerRebateCustomerUpdateCmd) {
		LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
		queryWrapper.eq(DealerRebateCustomerDO::getCustomerId, dealerRebateCustomerUpdateCmd.getCustomerId());
		queryWrapper.last("limit 1");

		DealerRebateCustomerDO dealerRebateCustomerDO = dealerRebateCustomerMapper.selectOne(queryWrapper);

		dealerRebateCustomerConvert.toDealerRebateCustomerDO(dealerRebateCustomerDO, dealerRebateCustomerUpdateCmd);
		dealerRebateCustomerMapper.updateById(dealerRebateCustomerDO);

		return dealerRebateCustomerConvert.toDealerRebateCustomer(dealerRebateCustomerDO);
	}

	@Override
	public DealerRebateCustomer show(DealerRebateCustomerShowQry dealerRebateCustomerShowQry) {
		LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getCustomerId()), DealerRebateCustomerDO::getCustomerId, dealerRebateCustomerShowQry.getCustomerId());
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getDealerId()), DealerRebateCustomerDO::getDealerId, dealerRebateCustomerShowQry.getDealerId());
		queryWrapper.eq(Objects.nonNull(dealerRebateCustomerShowQry.getStatus()), DealerRebateCustomerDO::getStatus, dealerRebateCustomerShowQry.getStatus());


		queryWrapper.last("limit 1");

		DealerRebateCustomerDO dealerRebateCustomerDO = dealerRebateCustomerMapper.selectOne(queryWrapper);
		if (Objects.nonNull(dealerRebateCustomerDO)) {
			dealerRebateCustomerDO.setDealerDO(dealerMapper.selectById(dealerRebateCustomerDO.getDealerId()));
		}
		return dealerRebateCustomerConvert.toDealerRebateCustomer(dealerRebateCustomerDO);
	}

	@Override
	public void destroy(DealerRebateCustomerDestroyCmd dealerRebateCustomerDestroyCmd) {
		LambdaQueryWrapper<DealerRebateCustomerDO> queryWrapper = Wrappers.lambdaQuery(DealerRebateCustomerDO.class);
		queryWrapper.eq(DealerRebateCustomerDO::getCustomerId, dealerRebateCustomerDestroyCmd.getCustomerId());
		queryWrapper.last("limit 1");

		DealerRebateCustomerDO dealerRebateCustomerDO = dealerRebateCustomerMapper.selectOne(queryWrapper);
		dealerRebateCustomerDO.deleteById();
	}
}

