package com.ruoyi.bst.order.service;

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.OrderChangeDeviceDTO;
import com.ruoyi.bst.order.domain.dto.OrderCloseDeviceDTO;
import com.ruoyi.bst.order.domain.dto.OrderCreateDTO;
import com.ruoyi.bst.order.domain.dto.OrderEndDTO;
import com.ruoyi.bst.order.domain.dto.OrderRefundDTO;
import com.ruoyi.bst.order.domain.dto.OrderVerifyDTO;
import com.ruoyi.bst.order.domain.vo.OrderEndVO;
import com.ruoyi.bst.order.domain.vo.OrderFeeVO;
import com.ruoyi.bst.pay.domain.vo.DoPayVO;

/**
 * 订单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(OrderEndDTO dto);

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

    /**
     * 操作订单设备开启
     *
     * @param order       订单
     * @param requiredIot 是否必须成功
     * @return 结果
     */
    public DeviceIotVO openDevice(OrderVO order, boolean requiredIot);

    /**
     * 操作订单设备关闭
     *
     * @param order       订单
     * @param requiredIot 是否必须成功
     * @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);
}
