package com.ylx.order.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
import com.ylx.massage.domain.TWxUser;
import com.ylx.order.domain.TOrder;
import com.ylx.order.domain.dto.*;
import com.ylx.order.domain.vo.BookingSlotsVO;
import com.ylx.order.domain.vo.OrderDateQueryVo;
import com.ylx.order.domain.vo.OrderDetailVO;
import com.ylx.order.domain.vo.RecentMerchantVO;
import com.ylx.order.domain.vo.merchant.MerchantCancelOrderDTO;
import com.ylx.order.domain.vo.merchant.MerchantOrderDetailVO;
import com.ylx.order.domain.vo.merchant.OrderCustomerPhoneVO;
import com.ylx.order.domain.vo.merchant.OrderPageVO;

import java.util.List;
import java.util.Map;


/**
 * 订单表 服务类
 */
public interface TOrderService extends IService<TOrder> {

    Map<String, Object> submitOrder(OrderSubmitDTO dto);

    /**
     * 用户端订单列表
     * @param dto
     * @return
     */
    Page<OrderDateQueryVo> queryOrderList(OrderDateQueryDTO dto);

    /*
     * 逻辑删除订单
     */
    void logicDeleteOrder(Long orderId);

    void processOrderPayment(WxPayOrderNotifyV3Result.DecryptNotifyResult result, TWxUser wxUser, TOrder order);

    /**
     * 修改订单表状态必须使用此接口（此接口里面会插入订单流转记录表）
     * @param dto
     */
    void updateOrderStatus(OrderUpdateStatusDTO dto);

    /**
     * 根据订单ID查询订单详情
     * @param orderId 订单主键ID
     * @return 订单详情VO
     */
    OrderDetailVO getOrderDetailById(Long orderId);

    /**
     * 用户端取消订单
     * @param dto 取消订单DTO
     * @return 取消结果
     */
    int cancelOrder(OrderCancleDTO dto);

    Boolean bookingCheck(BookingCheckDTO dto);

    Page<OrderPageVO> queryMerchantOrderList(OrderDateQueryDTO dto);

    void rejectOrder(OrderRejectDTO dto);

    void acceptOrder(OrderAcceptDTO dto);

    OrderCustomerPhoneVO getCustomerPhoneByOrderId(OrderPhoneQueryDTO dto);

    void merchantCancelOrderToAfterSale(MerchantCancelOrderDTO dto);

    void startService(MerchantOrderOperateDTO dto);

    void finishService(MerchantOrderOperateDTO dto);

    void merchantArriveSign(MerchantOrderOperateDTO dto);

    Page<RecentMerchantVO> getRecentMerchants(RecentOrderQueryDTO dto);

    MerchantOrderDetailVO getMerchantOrderDetail(MerchantOrderDetailDTO dto);

    List<BookingSlotsVO> bookingSlots(BookingSlotsDTO dto);
}
