package org.dromara.mall.trade.service;

import org.dromara.mall.trade.domain.bo.MallOrderCouponBo;
import org.dromara.mall.trade.domain.vo.MallOrderCouponVo;

import java.util.Collection;
import java.util.List;

/**
 * 订单优惠券使用记录Service接口
 *
 * @author pengles
 */
public interface MallOrderCouponService {

    /**
     * 查询订单优惠券使用记录
     */
    MallOrderCouponVo queryById(Long id);

    /**
     * 根据订单ID查询订单优惠券使用记录列表
     */
    List<MallOrderCouponVo> queryListByOrderId(Long orderId);

    /**
     * 根据订单号查询订单优惠券使用记录列表
     */
    List<MallOrderCouponVo> queryListByOrderNo(String orderNo);

    /**
     * 新增订单优惠券使用记录
     */
    Boolean insertByBo(MallOrderCouponBo bo);

    /**
     * 校验并批量删除订单优惠券使用记录信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 计算并使用优惠券（订单创建时调用）
     * 计算优惠券折扣金额，创建订单优惠券使用记录，并标记用户优惠券为已使用
     *
     * @param couponUserId 用户优惠券ID
     * @param orderId 订单ID
     * @param orderNo 订单号
     * @param orderAmount 订单金额（单位：分）
     * @return 优惠金额（单位：分）
     */
    Long calculateAndUseCoupon(Long couponUserId, Long orderId, String orderNo, Long orderAmount);

    /**
     * 根据订单ID统计优惠金额
     *
     * @param orderId 订单ID
     * @return 优惠金额总和（单位：分）
     */
    Long sumDiscountAmountByOrderId(Long orderId);

    /**
     * 根据订单号统计优惠金额
     *
     * @param orderNo 订单号
     * @return 优惠金额总和（单位：分）
     */
    Long sumDiscountAmountByOrderNo(String orderNo);

    /**
     * 根据优惠券ID统计核销金额
     *
     * @param couponId 优惠券ID
     * @return 核销金额总和（单位：分）
     */
    Long sumDiscountAmountByCouponId(Long couponId);

}
