package com.ruoyi.bst.order.service;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import com.ruoyi.bst.order.domain.Order;
import com.ruoyi.bst.order.domain.OrderVO;
import com.ruoyi.bst.order.domain.OrderQuery;
import com.ruoyi.bst.order.domain.dto.OrderCreateDTO;
import com.ruoyi.bst.order.domain.dto.OrderRefundDTO;
import com.ruoyi.bst.pay.domain.PayQuery;
import com.ruoyi.bst.pay.domain.vo.DoPayVO;
import com.ruoyi.common.domain.vo.LocalDateTimeIntegerVO;
import com.ruoyi.common.domain.vo.LongDecimalVO;
import com.ruoyi.common.domain.vo.LongIntegerVO;
import com.ruoyi.common.domain.vo.LongLocalDateTimeVO;
import com.ruoyi.system.user.domain.vo.UserConsumeVO;
import org.apache.ibatis.annotations.Param;

/**
 * 订单列表Service接口
 *
 * @author ruoyi
 * @date 2025-04-26
 */
public interface OrderService
{
    /**
     * 查询订单列表
     *
     * @param id 订单列表主键
     * @return 订单列表
     */
    public OrderVO selectOrderById(Long id);

    /**
     * 查询订单列表列表
     *
     * @param order 订单列表
     * @return 订单列表集合
     */
    public List<OrderVO> selectOrderList(OrderQuery order);

    /**
     * 新增订单列表
     *
     * @param order 订单列表
     * @return 结果
     */
    public int insertOrder(Order order);

    /**
     * 修改订单列表
     *
     * @param order 订单列表
     * @return 结果
     */
    public int updateOrder(Order order);

    /**
     * 批量删除订单列表
     *
     * @param ids 需要删除的订单列表主键集合
     * @return 结果
     */
    public int deleteOrderByIds(Long[] ids);

    /**
     * 删除订单列表信息
     *
     * @param id 订单列表主键
     * @return 结果
     */
    public int deleteOrderById(Long id);

    /**
     * 创建订单
     * @param dto 创建订单DTO
     * @return 订单
     */
    public DoPayVO createOrder(OrderCreateDTO dto);

    /**
     * 查询订单
     * @param no 订单编号
     * @param scope 是否数据隔离
     * @return 订单
     */
    public OrderVO selectOrderByNo(String no, boolean scope);

    /**
     * 查询订单
     * @param no 订单编号
     * @return 订单
     */
    default OrderVO selectOrderByNo(String no) {
        return this.selectOrderByNo(no, false);
    }


    /**
     * 查询单个订单
     * @param query 查询条件
     * @return 订单
     */
    public OrderVO selectOne(OrderQuery query);

    /**
     * 取消过期订单
     * @param order 订单
     */
    public void cancelWhenExpired(Order order);

    /**
     * 取消订单
     * @param id 订单ID
     * @return 结果
     */
    public int cancelOrder(Long id, String remark);

    OrderVO selectOrderByBstId(Long bstId);

    /**
     * 退款
     * @param dto 参数
     * @return 结果
     */
    public int refund(OrderRefundDTO dto);


    /**
     * 增加退款的爆灯次数
     * @param id 支付单ID
     * @param number 退款爆灯数
     * @return 结果
     */
    int addRefundNum(Long id, Integer number);

    /**
     * 查询订单数量
     * @param orderQuery
     * @return
     */
    List<LocalDateTimeIntegerVO> selectOrderCount(OrderQuery orderQuery);

    /**
     * 根据店铺ID分组查询订单数量
     * @param query
     * @return
     */
    List<LongIntegerVO> selectCountGroupByStoreId(OrderQuery query);


    /**
     * 根据用户ID查询消费总金额
     * @param query
     * @return
     */
    List<LongDecimalVO> selectSumOfAmountGroupByUserId(OrderQuery query);

    /**
     * 查询用户最近消费时间
     * @param query
     * @return
     */
    List<LongLocalDateTimeVO> assembleLastConsumeTime(OrderQuery query);

    /**
     * 查询指定店铺下的用户数量
     * @param query
     * @return
     */
    Integer selectUserCount(OrderQuery query);
}
