package com.ruoyi.bst.order.service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

import com.ruoyi.bst.device.domain.vo.DeviceIotVO;
import com.ruoyi.bst.order.domain.Order;
import com.ruoyi.bst.order.domain.OrderQuery;
import com.ruoyi.bst.order.domain.OrderVO;
import com.ruoyi.bst.order.domain.dto.OrderCalcFeeDTO;
import com.ruoyi.bst.order.domain.dto.OrderCalcRideFeeDTO;
import com.ruoyi.bst.order.domain.dto.OrderChangeDeviceDTO;
import com.ruoyi.bst.order.domain.dto.OrderCloseDeviceDTO;
import com.ruoyi.bst.order.domain.dto.OrderCreateDTO;
import com.ruoyi.bst.order.domain.dto.OrderDeductDTO;
import com.ruoyi.bst.order.domain.dto.OrderEndDTO;
import com.ruoyi.bst.order.domain.dto.OrderOpenDeviceDTO;
import com.ruoyi.bst.order.domain.dto.OrderPayRideFeeDTO;
import com.ruoyi.bst.order.domain.dto.OrderRefundDTO;
import com.ruoyi.bst.order.domain.dto.OrderRidePaySuccessDTO;
import com.ruoyi.bst.order.domain.dto.OrderSeatDTO;
import com.ruoyi.bst.order.domain.dto.OrderUpdatePriceDTO;
import com.ruoyi.bst.order.domain.dto.OrderVerifyDTO;
import com.ruoyi.bst.order.domain.vo.OrderCalcPreRideFeeVO;
import com.ruoyi.bst.order.domain.vo.OrderCalcRideFeeVO;
import com.ruoyi.bst.order.domain.vo.OrderEndVO;
import com.ruoyi.bst.order.domain.vo.OrderFeeVO;
import com.ruoyi.bst.pay.domain.vo.DoPayVO;
import com.ruoyi.bst.vipUser.domain.VipUserVO;

/**
 * 订单Service接口
 *
 * @author ruoyi
 * @date 2025-03-24
 */
public interface OrderService {
    /**
     * 查询订单
     *
     * @param id 订单主键
     * @return 订单
     */
    public OrderVO selectOrderById(Long id, boolean scope);

    default OrderVO selectOrderById(Long id) {
        return this.selectOrderById(id, false);
    }

    /**
     * 查询订单列表
     *
     * @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 query 查询条件
     * @return 订单
     */
    public OrderVO selectOne(OrderQuery query);

    /**
     * 创建订单
     *
     * @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 id 订单ID
     * @return 结果
     */
    public int cancelOrder(Long id, String remark);

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

    /**
     * 结束订单
     *
     * @param dto 参数
     * @return 结果
     */
    public OrderEndVO endOrder(OrderEndDTO dto);

    /**
     * 计算订单金额
     *
     * @param dto 参数
     * @return 结果
     */
    public OrderFeeVO calcFee(OrderCalcFeeDTO dto);

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

    /**
     * 操作订单设备开启
     * @return 结果
     */
    public DeviceIotVO openDevice(OrderOpenDeviceDTO dto);

    /**
     * 操作订单设备关闭
     *
     * @return 结果
     */
    public DeviceIotVO closeDevice(OrderCloseDeviceDTO dto);

    /**
     * 更新订单设备ID
     *
     * @param id            订单ID
     * @param orderDeviceId 订单设备ID
     * @return 结果
     */
    public int updateOrderDeviceId(Long id, Long orderDeviceId);

    /**
     * 换车
     *
     * @param dto 换车DTO
     * @return 结果
     */
    public int changeDevice(OrderChangeDeviceDTO dto);

    /**
     * 还车审核
     *
     * @param dto 审核DTO
     * @return 结果
     */
    public int verify(OrderVerifyDTO dto);

    /**
     * 查询ID列表
     *
     * @param query
     */
    public List<Long> selectIdList(OrderQuery query);

    /**
     * 更新订单距离
     *
     * @param id       订单ID
     * @param distance 距离
     */
    public int updateDisatance(Long id, BigDecimal distance);

    /**
     * 打开坐垫锁
     *
     * @param dto 参数
     * @return 结果
     */
    public boolean seat(OrderSeatDTO dto);

    /**
     * 押金抵扣
     *
     * @param dto 参数
     * @return 结果
     */
    public int deduct(OrderDeductDTO dto);

    /**
     * 退还剩余押金
     *
     * @param order 订单
     */
    public int refundRemainDeposit(OrderVO order);

    /**
     * 支付骑行费
     *
     * @param dto 参数
     * @return 结果
     */
    public DoPayVO payRideFee(OrderPayRideFeeDTO dto);

    /**
     * 处理骑行费支付成功
     * @param dto @return
     */
    public int handleRidePaySuccess(OrderRidePaySuccessDTO dto);

    /**
     * 改价
     * @param dto
     * @return
     */
    public int updatePrice(OrderUpdatePriceDTO dto);

    /**
     * 计算应付骑行费
     * @param dto
     * @return
     */
    public OrderCalcRideFeeVO calcRideFee(OrderCalcRideFeeDTO dto);

    /**
     * 计算应付骑行费
     * @param order
     * @param vipUser
     * @return
     */
    public OrderCalcRideFeeVO calcRideFee(OrderVO order, VipUserVO vipUser);

    /**
     * 计算预估骑行费
     * @param orderId
     * @return
     */
    public OrderCalcPreRideFeeVO calcPreRideFee(Long orderId, LocalDateTime endTime);
}
