package com.ruoyi.bst.order.service;

import com.ruoyi.bst.area.domain.AreaVO;
import com.ruoyi.bst.device.domain.DeviceVO;
import com.ruoyi.bst.order.domain.OrderVO;
import com.ruoyi.bst.order.domain.bo.OrderCreateBO;
import com.ruoyi.bst.order.domain.bo.OrderDeductBO;
import com.ruoyi.bst.order.domain.bo.OrderEndBO;
import com.ruoyi.bst.order.domain.bo.OrderPayRideFeeBO;
import com.ruoyi.bst.order.domain.vo.OrderInParkingVO;

public interface OrderValidator {

    /**
     * 校验订单BO
     * @param bo 订单BO
     */
    void validate(OrderCreateBO bo);

    /**
     * 校验用户是否可以支付指定订单
     * @param order 订单
     * @param userId 用户ID
     * @return 是否可以支付
     */
    boolean canPay(OrderVO order, Long userId);

    /**
     * 校验普通用户是否可以结束指定订单
     * @param order 订单
     * @param userId 用户ID
     * @return 是否可以结束
     */
    boolean canEnd(OrderVO order, Long userId);

    /**
     * 校验订单结束BO
     * @param bo 订单结束BO
     */
    void validate(OrderEndBO bo, boolean ignoreInParking);


    /**
     * 校验用户是否可以操作设备开启
     * @param order 订单
     * @param userId 用户ID
     * @return 是否可以操作设备开启
     */
    boolean canOpenDevice(OrderVO order, Long userId);

    /**
     * 校验用户是否可以操作设备关闭
     * @param order 订单
     * @param userId 用户ID
     * @return 是否可以操作设备关闭
     */
    boolean canCloseDevice(OrderVO order, Long userId);

    /**
     * 校验用户是否可以换车
     * @param order 订单
     * @param userId 用户ID
     * @return 是否可以换车
     */
    boolean canChangeDevice(OrderVO order, Long userId);

    /**
     * 校验能否还车
     * @param area 运营区
     * @param inParkingVO 是否在停车点内
     */
    void checkInParking(AreaVO area, OrderInParkingVO inParkingVO);

    /**
     * 校验设备能否使用
     * @param device 设备
     * @param order 订单
     */
    void canUseDevice(DeviceVO device, OrderVO order);

    /**
     * 校验并设置图片
     * @param order 订单
     * @param picture 图片
     */
    void checkReturnPicture(OrderVO order, String picture);

    /**
     * 校验用户是否可以操作指定订单
     * @param orderId 订单ID
     * @return 是否可以操作
     */
    boolean canOperate(Long orderId);

    /**
     * 校验订单是否超时
     * @param order 订单
     * @return 是否超时
     */
    boolean isTimeout(OrderVO order);
    
    /**
     * 是否是用户
     */
    boolean isUser(Long orderId, Long userId);

    /**
     * 是否是用户
     */
    boolean isUser(OrderVO order, Long userId);

    /**
     * 校验订单支付骑行费
     * @param bo 订单支付骑行费BO
     */
    void validate(OrderPayRideFeeBO bo);

    /**
     * 校验订单抵扣
     * @param bo 订单抵扣BO
     */
    void validate(OrderDeductBO bo);
}
