package cn.iocoder.yudao.module.system.dal.mysql.rental;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.rental.vo.order.RentalOrderPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.rental.vo.order.RentalOrderRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.rental.RentalCustomerDO;
import cn.iocoder.yudao.module.system.dal.dataobject.rental.RentalDepositRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.rental.RentalOrderDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;

/**
 * 租赁订单 Mapper
 *
 * @author 符溶馨
 */
@Mapper
public interface RentalOrderMapper extends BaseMapperX<RentalOrderDO> {

    default PageResult<RentalOrderRespVO> selectPage(RentalOrderPageReqVO reqVO) {

        MPJLambdaWrapperX<RentalOrderDO> queryWrapper = new MPJLambdaWrapperX<>();
        queryWrapper.selectAll(RentalOrderDO.class);
        queryWrapper.selectAs(RentalCustomerDO::getName, RentalOrderRespVO::getCustomerName);
        queryWrapper.selectAs("COALESCE( SUM( CASE WHEN deposit.type = 1 THEN deposit.amount END ), 0 )", RentalOrderRespVO::getReceivedAmount);
        queryWrapper.selectAs("COALESCE( SUM( CASE WHEN deposit.type = 2 THEN deposit.amount END ), 0 )", RentalOrderRespVO::getRefundAmount);
        queryWrapper.selectAs(AdminUserDO::getNickname, RentalOrderRespVO::getCreatorName);
        queryWrapper.leftJoin(RentalDepositRecordDO.class, "deposit", RentalDepositRecordDO::getOrderNo, RentalOrderDO::getOrderNo);
        queryWrapper.leftJoin(AdminUserDO.class, AdminUserDO::getId, RentalOrderDO::getCreator);
        queryWrapper.leftJoin(RentalCustomerDO.class, RentalCustomerDO::getId, RentalOrderDO::getCustomerId);
        queryWrapper.eqIfPresent(RentalOrderDO::getOrderNo, reqVO.getOrderNo())
                .eqIfPresent(RentalOrderDO::getCustomerId, reqVO.getCustomerId())
                .eqIfPresent(RentalOrderDO::getDepositAmount, reqVO.getDepositAmount())
                .eqIfPresent(RentalOrderDO::getStatus, reqVO.getStatus())
                .likeIfPresent(RentalOrderDO::getRecipient, reqVO.getRecipient())
                .betweenIfPresent(RentalOrderDO::getCreateTime, reqVO.getCreateTime())
                .inIfPresent(RentalOrderDO::getCustomerId, reqVO.getCustomerIds())
                .groupBy(RentalOrderDO::getOrderNo)
                .orderByDesc(RentalOrderDO::getCreateTime);

        return selectJoinPage(reqVO, RentalOrderRespVO.class, queryWrapper);
    }

    BigDecimal selectOrderAmount(@Param("orderNo") String orderNo);
}