package com.ylx.massage.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.common.core.domain.R;
import com.ylx.massage.domain.Product;
import com.ylx.massage.domain.ProductOrderInfo;
import com.ylx.massage.domain.dto.*;
import com.ylx.massage.domain.vo.*;

/**
 * 商品订单信息Service接口
 */
public interface IProductOrderInfoService extends IService<ProductOrderInfo> {

    /**
     * 创建商品订单
     *
     * @param request 订单创建请求
     * @return 订单编号
     */
    String createProductOrder(ProductOrderCreateRequest request);

    /**
     * 支付订单
     *
     * @param productOrderPayRequest 订单支付请求
     * @return R 支付结果
     */
    public R payOrder(ProductOrderPayRequest productOrderPayRequest) throws Exception;

    /**
     * 分页查询用户商品订单列表
     *
     * @param page 分页参数
     * @param openId 用户openId
     * @return 订单分页列表
     */
    Page<ProductOrderListVo> getProductOrderList(Page<ProductOrderListVo> page, String openId);

    /**
     * 查询订单详情
     *
     * @param orderNo 订单编号
     * @param openId 用户openId
     * @return 订单详情（结构化响应）
     */
    ProductOrderDetailResponse getProductOrderDetail(String orderNo, String openId);

    /**
     * 取消订单
     *
     * @param request 订单取消请求
     * @return R<?> 取消结果
     */
    R<?> cancelOrder(ProductOrderCancelRequest request);

    void confirmReceipt(ProductOrderOperateDTO dto);

    Page<ProductOrderPageItemVo> adminPage(Page<ProductOrderInfo> page, ProductOrderPageDTO dto);

    ProductOrderDetailAdminVo getOrderDetailForAdmin(Long orderId);

    ProductOrderCountVo adminPageStats();

    void editLogisticsNo(ProductOrderEditLogisticsNo dto);

    void editConsigneesInfo(ProductOrderOperateDTO dto);

    /**
     * 获取并检查订单是否存在
     * @param orderId
     * @param openId
     * @return ProductOrderInfo 订单信息
     */
    ProductOrderInfo getAndCheckOrder(Long orderId, String openId);

    /**
     * 处理微信支付回调（商品订单）
     * @param orderNo 订单编号
     */
    void handleWxPayCallback(String orderNo);
}