package com.seer.teach.mall.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.seer.teach.common.enums.OrderStatusEnum;
import com.seer.teach.mall.api.req.AfterSaleRefundNotifyReq;
import com.seer.teach.mall.api.req.OrderPayNotifyReq;
import com.seer.teach.mall.entity.OrderEntity;
import com.seer.teach.mall.request.OrderConsigneeUpdateReq;

import java.util.Collection;
import java.util.List;

public interface IOrderService extends IService<OrderEntity> {

    /**
     * 检查订单
     *
     * @param orderSn 订单sn编码
     * @return 订单详情
     */
    OrderEntity checkOrderBySn(String orderSn);

    /**
     * 检查订单
     *
     * @param orderId 订单sn编码
     * @return 订单详情
     */
    OrderEntity checkOrderByOrderId(Integer orderId);

    /**
     * 更新订单的支付订单ID
     * @param id 订单ID
     * @param payOrderId 支付订单ID
     * @return true:更新成功，false:更新失败
     */
    boolean updatePayOrderIdById(Integer id,Integer payOrderId);

    /**
     * 根据订单编号查询订单
     * @param orderSn 订单编号
     * @return 订单
     */
    OrderEntity getOneByOrderSn(String orderSn);

    /**
     * 发货订单
     *
     * @param orderId 订单ID
     * @param logisticsCode 物流公司编码
     * @param shippingNo 物流单号
     * @param userId 发货人用户ID
     * @return true:配送成功，false:配送失败
     */
    boolean deliveryOrder(Integer orderId, String logisticsCode, String shippingNo,Integer userId);
    
    /**
     * 部分订单发货
     *
     * @param orderId 子订单ID
     * @return true:配送成功，false:配送失败
     */
    boolean deliveryPartOrder(Integer orderId);

    /**
     * 获取订单列表
     *
     * @param orderIds 订单ID集合
     * @return 订单列表
     */
    List<OrderEntity> getListByOrderIds(Collection<Integer> orderIds);

    /**
     * 取消订单
     *
     * @param orderId 订单Id
     * @param orderStatusEnum 订单状态
     * @param userId 取消人用户ID
     * @return true:取消成功，false:取消失败
     */
    boolean cancelOrder(Integer orderId, OrderStatusEnum orderStatusEnum, int userId);

    /**
     * 确认收货
     *
     * @param orderId 订单Id
     * @param childOrderSn 子订单编号
     * @param userId 确认人用户ID
     * @return true:确认成功，false:确认失败
     */
    boolean receiveOrder(Integer orderId, String childOrderSn, int userId);

    /**
     * 删除订单
     *
     * @param orderId 订单id
     * @param userId 操作人的Id
     * @return true:删除成功，false：删除失败
     */
    boolean deleteOrder(Integer orderId, Integer userId);

    /**
     * 订单支付成功后的处理
     *
     * @param orderPayNotifyReq 订单状态更新参数对象
     * @return true:更新成功，false:更新失败
     */
    boolean orderPayAfterSuccessNotify(OrderPayNotifyReq orderPayNotifyReq);
    
    /**
     * 订单支付失败后的处理
     *
     * @param orderPayNotifyReq 订单状态更新参数对象
     * @return true:更新成功，false:更新失败
     */
    boolean orderPayAfterFailNotify(OrderPayNotifyReq orderPayNotifyReq);
    
    /**
     * 更新订单收件人信息
     *
     * @param req 订单收件人信息更新请求参数
     * @return true:更新成功，false:更新失败
     */
    boolean updateOrderConsigneeInfo(OrderConsigneeUpdateReq req);

}