package cn.axzo.msg.center.dal.impl;

import cn.axzo.msg.center.dal.MNSMessageRedoDao;
import cn.axzo.msg.center.dal.mapper.MNSMessageRedoMapper;
import cn.axzo.msg.center.domain.entity.MNSMessageRedo;
import cn.axzo.msg.center.domain.query.MessageRedoQuery;
import cn.axzo.msg.center.notices.common.enums.IsDeletedEnum;
import cn.axzo.msg.center.notices.common.enums.MessageStatusEnum;
import cn.axzo.msg.center.notices.common.enums.RetryingFlagEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;

@Repository("mnsMessageRedoDao")
public class MNSMNSMessageRedoDaoImpl extends ServiceImpl<MNSMessageRedoMapper, MNSMessageRedo> implements MNSMessageRedoDao {

  @Override
  public IPage<MNSMessageRedo> queryByPage(MessageRedoQuery query) {
    return this.page(query.toPage(), new LambdaQueryWrapper<MNSMessageRedo>()
        .eq(query.getId() != null, MNSMessageRedo::getId, query.getId())
        .ge(query.getStartCreateTime() != null, MNSMessageRedo::getCreateAt, query.getStartCreateTime())
        .le(query.getEndCreateTime() != null, MNSMessageRedo::getCreateAt, query.getEndCreateTime())
        .in(CollectionUtils.isNotEmpty(query.getStatuses()), MNSMessageRedo::getStatus, query.getStatuses())
        .eq(StringUtils.isNoneBlank(query.getChannelCode()), MNSMessageRedo::getChannelCode, query.getChannelCode())
        .eq(MNSMessageRedo::getRetryingFlag, RetryingFlagEnum.Y.name())
        .eq(MNSMessageRedo::getIsDelete, IsDeletedEnum.NO.getCode())
        .orderByDesc(MNSMessageRedo::getCreateAt));
  }

  @Override
  public boolean updateExceptionToFail(Long id) {
    return lambdaUpdate()
        .set(MNSMessageRedo::getStatus, MessageStatusEnum.FAIL.getCode())
        .eq(MNSMessageRedo::getId, id)
        .eq(MNSMessageRedo::getStatus, MessageStatusEnum.EXCEPTION.getCode())
        .update();
  }
}