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

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.GiftBoxCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.GiftBoxDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.GiftBoxUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.GiftBoxListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.GiftBoxPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.GiftBoxShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.GiftBox;
import com.xunhong.erp.turbo.biz.domain.gateway.GiftBoxGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.GiftBoxConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.GiftBoxDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.GiftBoxMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Objects;

/**
 * @author shenyifei
 */
@Repository
@RequiredArgsConstructor
public class GiftBoxGatewayImpl implements GiftBoxGateway {
	private final GiftBoxMapper giftBoxMapper;
	private final GiftBoxConvert giftBoxConvert;

	@Override
	public GiftBox save(GiftBoxCreateCmd giftBoxCreateCmd) {
		GiftBoxDO giftBoxDO = giftBoxConvert.toGiftBoxDO(giftBoxCreateCmd);
		giftBoxMapper.insert(giftBoxDO);

		return giftBoxConvert.toGiftBox(giftBoxDO);
	}

	@Override
	public IPage<GiftBox> page(GiftBoxPageQry giftBoxPageQry) {
		LambdaQueryWrapper<GiftBoxDO> queryWrapper = Wrappers.lambdaQuery(GiftBoxDO.class);
		queryWrapper.like(StrUtil.isNotBlank(giftBoxPageQry.getName()), GiftBoxDO::getName, giftBoxPageQry.getName());
		queryWrapper.like(StrUtil.isNotBlank(giftBoxPageQry.getRemark()), GiftBoxDO::getRemark, giftBoxPageQry.getRemark());
		queryWrapper.eq(Objects.nonNull(giftBoxPageQry.getStatus()), GiftBoxDO::getStatus, giftBoxPageQry.getStatus());
		queryWrapper.orderByDesc(GiftBoxDO::getCreatedAt);

		IPage<GiftBoxDO> page = new Page<>(giftBoxPageQry.getPageIndex(), giftBoxPageQry.getPageSize());
		page = giftBoxMapper.selectPage(page, queryWrapper);

		return page.convert(giftBoxConvert::toGiftBox);
	}

	@Override
	public List<GiftBox> list(GiftBoxListQry giftBoxListQry) {
		LambdaQueryWrapper<GiftBoxDO> queryWrapper = Wrappers.lambdaQuery(GiftBoxDO.class);
		List<GiftBoxDO> giftBoxDOList = giftBoxMapper.selectList(queryWrapper);
		return giftBoxDOList.stream().map(giftBoxConvert::toGiftBox).toList();
	}

	@Override
	public GiftBox update(GiftBoxUpdateCmd giftBoxUpdateCmd) {
		LambdaQueryWrapper<GiftBoxDO> queryWrapper = Wrappers.lambdaQuery(GiftBoxDO.class);
		queryWrapper.eq(GiftBoxDO::getBoxId, giftBoxUpdateCmd.getBoxId());
		queryWrapper.last("limit 1");

		GiftBoxDO giftBoxDO = giftBoxMapper.selectOne(queryWrapper);

		giftBoxConvert.toGiftBoxDO(giftBoxDO, giftBoxUpdateCmd);
		giftBoxMapper.updateById(giftBoxDO);

		return giftBoxConvert.toGiftBox(giftBoxDO);
	}

	@Override
	public GiftBox show(GiftBoxShowQry giftBoxShowQry) {
		LambdaQueryWrapper<GiftBoxDO> queryWrapper = Wrappers.lambdaQuery(GiftBoxDO.class);
		queryWrapper.eq(GiftBoxDO::getBoxId, giftBoxShowQry.getBoxId());
		queryWrapper.last("limit 1");

		GiftBoxDO giftBoxDO = giftBoxMapper.selectOne(queryWrapper);
		return giftBoxConvert.toGiftBox(giftBoxDO);
	}

	@Override
	public void destroy(GiftBoxDestroyCmd giftBoxDestroyCmd) {
		LambdaQueryWrapper<GiftBoxDO> queryWrapper = Wrappers.lambdaQuery(GiftBoxDO.class);
		queryWrapper.eq(GiftBoxDO::getBoxId, giftBoxDestroyCmd.getBoxId());
		queryWrapper.last("limit 1");

		GiftBoxDO giftBoxDO = giftBoxMapper.selectOne(queryWrapper);
		giftBoxDO.deleteById();
	}
}

