package com.snack.server.module.order.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snack.server.module.order.dto.req.OrderPageReq;
import com.snack.server.module.order.dto.req.OrderSubmitReq;
import com.snack.server.module.order.vo.OrderDetailVO;

import java.util.List;

/**
 * 订单业务接口
 */
public interface OrderService {

    /**
     * 提交订单（事务：校验库存 → 扣库存 → 创建订单 → 删购物车）
     * @return 创建成功的订单号
     */
    String submitOrder(OrderSubmitReq req);

    /**
     * 订单详情（用户端）
     */
    OrderDetailVO getDetailByCurrentUser(Long orderId);

    /**
     * 订单详情（管理端）
     */
    OrderDetailVO getDetailForAdmin(Long orderId);

    /**
     * 当前用户订单分页
     */
    Page<OrderDetailVO> pageCurrentUserOrders(OrderPageReq req);

    /**
     * 管理端订单分页
     */
    Page<OrderDetailVO> pageAllOrders(OrderPageReq req);

    /**
     * 模拟支付（测试用，对接真实支付时改为接入微信 / 支付宝回调）
     */
    void payOrder(Long orderId);

    /**
     * 支付宝 / 微信支付成功回调（异步通知时调用）
     * @param orderId 订单 ID
     * @param payChannel 支付渠道
     * @param payTradeNo 第三方交易号
     * @return true 成功
     */
    boolean handlePaySuccess(Long orderId, String payChannel, String payTradeNo);

    /**
     * 取消订单（用户端）
     * - 待付款 → 已取消
     * - 已付款但未发货 → 申请退款
     */
    void cancelOrder(Long orderId);

    /**
     * 确认收货
     */
    void confirmReceive(Long orderId);

    /**
     * 申请退款（用户主动申请，需商家审核）
     * @param orderId 订单 ID
     * @param reason 退款原因
     */
    void applyRefund(Long orderId, String reason);

    /**
     * 支付宝 / 微信退款成功回调
     */
    boolean handleRefundSuccess(Long orderId, String refundTradeNo);

    /**
     * 订单发货（管理端）
     */
    void deliverOrder(Long orderId, String company, String trackingNo);

    /**
     * 管理员取消订单（强制取消）
     */
    void adminCancelOrder(Long orderId, String reason);

    /**
     * 后台统计：某状态订单数
     */
    long countByStatus(Integer status);
}
