package com.seer.teach.mall.order.service;

import com.seer.teach.mall.request.ChildOrderSenderReq;
import com.seer.teach.mall.request.OrderConsigneeUpdateReq;
import com.seer.teach.mall.request.OrderReq;
import com.seer.teach.mall.request.SenderConfigReq;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author Captain
 * @since 2025-06-10
 */
public interface IAdminOrderService {

    /**
     * 更新订单信息
     * <p>
     * 此方法用于处理订单更新请求
     *
     * @param orderReq 包含待更新订单信息的请求对象，不能为空
     * @return 订单更新操作是否成功，true表示成功，false表示失败
     */
    boolean updateOrder(OrderConsigneeUpdateReq orderReq);

    /**
     * 更新子订单信息
     * <p>
     * 此方法用于处理子订单更新请求
     *
     * @param orderReq 待更新子订单的请求对象，不能为空
     * @return 子订单更新操作是否成功，true表示成功，false表示失败
     */
    boolean updateChildOrder(OrderConsigneeUpdateReq orderReq, Long merchantUserId);

    /**
     * 发货订单
     * <p>
     * 该方法用于将特定订单的物流信息发送到物流系统或第三方服务它通常在订单处理流程中被调用，
     * 以通知物流服务准备配送当订单需要出库或者进行物流跟踪时，此方法将订单信息和物流编码一起发送
     *
     * @param orderId       订单ID，用于标识特定的订单
     * @param logisticsCode 物流编码，用于标识物流服务或跟踪信息
     * @param sender        发送配置请求对象，包含发送物流信息所需的各种配置和凭据
     * @return 返回一个布尔值，表示物流信息是否发送成功true表示发送成功，false表示发送失败
     */
    boolean deliveryOrder(Integer orderId, String logisticsCode, SenderConfigReq sender);


    /**
     * 商家子订单发货
     *
     * @param childOrderId 子订单ID
     * @param childOrderSenderReq 发货信息
     * @param merchantUserId 商家用户ID
     * @return 发货操作是否成功
     */
    boolean deliveryChildOrder(Integer childOrderId, ChildOrderSenderReq childOrderSenderReq, Long merchantUserId);

    /**
     * 删除订单
     *
     * @param orderReq 删除订单的请求对象
     * @return 删除操作是否成功
     */
    boolean deleteOrder(OrderReq orderReq);

    /**
     * 删除订单
     *
     * @param orderReq 删除订单的请求对象
     * @param merchantUserId 商家用户ID
     * @return 删除操作是否成功
     */
    boolean deleteChildOrder(OrderReq orderReq,Long merchantUserId);

    /**
     * 确认订单
     *
     * @param orderId        订单ID
     * @param orderStatus    订单状态
     * @param deliveryUserId 发货人ID
     * @return 确认订单操作是否成功
     */
    boolean confirm(Integer orderId, Integer orderStatus, Integer deliveryUserId);

    /**
     * 确认订单并通知
     *
     * @param orderId           订单ID
     * @param orderStatus       订单状态
     * @param deliveryUserId    发货人ID
     * @param businessSceneCode 业务场景编码
     * @return 确认订单并通知操作是否成功
     */
    boolean confirmAndNotify(Integer orderId, Integer orderStatus, Integer deliveryUserId, String businessSceneCode);

    /**
     * 关闭订单
     *
     * @param orderReq 关闭订单的请求对象
     * @return 关闭订单操作是否成功
     */
    boolean closeOrder(OrderReq orderReq);

    /**
     * 关闭订单
     *
     * @param orderReq 关闭订单的请求对象
     * @param merchantUserId 商家用户ID
     * @return 关闭订单操作是否成功
     */
    boolean closeChildOrder(OrderReq orderReq,Long merchantUserId);

}
