package com.seer.teach.mall.service;

import com.seer.teach.common.enums.OrderStatusEnum;
import com.seer.teach.mall.entity.OrderChildEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import com.seer.teach.mall.request.OrderConsigneeUpdateReq;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 商城订单子表 服务类
 * </p>
 *
 * @author ZS
 * @since 2025-09-18
 */
public interface IOrderChildService extends IService<OrderChildEntity> {

    /**
     * 根据订单ID获取子订单列表
     *
     * @param orderIds 父订单ID列表
     * @return 子订单列表
     */
    List<OrderChildEntity> getListByParentIds(Set<Integer> orderIds);

    /**
     * 根据父订单ID获取子订单列表
     *
     * @param orderId 父订单ID
     * @return 子订单列表
     */
    List<OrderChildEntity> getListByParentId(Integer orderId);

    /**
     * 根据子订单号获取子订单列表
     *
     * @param childOrderSn 子订单号
     * @return 子订单列表
     */
    List<OrderChildEntity> getListByChildOrderSn(String childOrderSn);

    /**
     * 检查子订单是否存在
     *
     * @param orderChildId 子订单ID
     * @return 子订单
     */
    OrderChildEntity checkOrderChild(Integer orderChildId);

    /**
     * 检查子订单是否存在
     *
     * @param orderChildSn 子订单Sn
     * @return 子订单
     */
    OrderChildEntity checkOrderChildByChildOrderSn(String orderChildSn);

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

    /**
     * 管理员父订单直接发货
     *
     * @param parentOrderId 父订单ID
     * @param logisticsCode 物流公司编码
     * @param billCode 运单号
     * @param userId 发货人的用户ID
     * @return true:配送成功，false:配送失败
     */
    boolean deliveryOrderByParentOrderId(Integer parentOrderId, String logisticsCode, String billCode, Integer userId);


    /**
     * 修改子订单收货地址ID
     *
     * @param childOrderId 子订单ID
     * @param addressId 收货地址ID
     * @return true:修改成功，false:修改失败
     */
    boolean updateAddressIdByChildOrderId(Integer childOrderId, Integer addressId);

    /**
     * 删除子订单
     *
     * @param parentOrderId 父订单ID
     * @return true:删除成功，false:删除失败
     */
    boolean deleteOrderByParentOrderId(Integer parentOrderId);

    /**
     * 商家删除子订单
     *
     * @param id 子订单ID
     * @return true:删除成功，false:删除失败
     */
    boolean deleteOrderByIdAndMerchantId(Integer id, Long merchantId);

    /**
     * 用户取消子订单
     *
     * @param childOrderId 子订单ID
     * @param userId 用户ID
     * @return true:取消成功，false:取消失败
     */
    boolean cancelOrder(Integer childOrderId, Integer userId);

    /**
     * 用户批量取消子订单
     *
     * @param childrenOrderIds 子订单ID列表
     * @param userId 用户ID
     * @return true:取消成功，false:取消失败
     */
    boolean cancelOrder(Set<Integer> childrenOrderIds, Integer userId);

    /**
     * 修改子订单状态
     *
     * @param id 子订单ID
     * @param orderStatusEnum 订单状态枚举
     * @return true:修改成功，false:修改失败
     */
    boolean updateStatusByParentOrderId(Integer id, OrderStatusEnum orderStatusEnum);

    /**
     * 更新订单收件人信息
     *
     * @param req 订单收件人信息更新请求参数
     * @return true:更新成功，false:更新失败
     */
    boolean updateOrderConsigneeInfo(OrderConsigneeUpdateReq req);

    /**
     * 批量更新订单收件人信息
     *
     * @param orderUpdateReq 订单收件人信息更新请求参数
     * @param childOrderIds 子订单ID列表
     * @return true:更新成功，false:更新失败
     */
    void updateOrderConsigneeInfoByChildOrderIds(OrderConsigneeUpdateReq orderUpdateReq, Set<Integer> childOrderIds);
}
