package com.liquidnet.service.goblin.service;

import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbCouponVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderCreateVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSqbOrderDetailVo;
import com.liquidnet.service.goblin.param.shouqianba.callback.CouponCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.OrderCallbackContent;
import com.liquidnet.service.goblin.param.shouqianba.callback.RefundCallbackContent;

import java.util.List;

/**
 * 收钱吧订单服务接口
 */
public interface IGoblinSqbOrderService {

    /**
     * 创建收钱吧订单
     *
     * @param userId         用户ID（从 token 获取）
     * @param spuId          商品 SPU ID
     * @param skuId          商品 SKU ID
     * @param quantity       购买数量
     * @param performancesId 关联演出 ID
     * @return 订单创建结果（orderId、acquiringSn、paymentVoucher）
     */
    ResponseDto<GoblinSqbOrderCreateVo> createOrder(String userId, String spuId, String skuId,
                                                    Integer quantity, String performancesId);

    /**
     * 查询支付状态
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 支付状态（0-待支付 1-已支付 9-失败）
     */
    ResponseDto<Integer> queryPayStatus(String userId, String orderId);

    /**
     * 获取核销二维码（券码）
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 券码信息（couponSn、couponQrCode、couponExpireTime）
     */
    ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId);

    /**
     * 申请退款
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 退款结果
     */
    ResponseDto<Boolean> refund(String userId, String orderId);

    /**
     * 主动同步核销状态
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 同步结果
     */
    ResponseDto<Boolean> syncCouponStatus(String userId, String orderId);

    /**
     * 支付成功回调（收钱吧主动推送）
     *
     * @param orderCallbackContent@return "success"
     */
    ResponseDto<String> handlePayCallback(OrderCallbackContent orderCallbackContent);

    /**
     * 退款成功回调（收钱吧主动推送）
     *
     * @param refundCallbackContent@return "success"
     */
    ResponseDto<String> handleRefundCallback(RefundCallbackContent refundCallbackContent);

    /**
     * 券状态变更回调（收钱吧主动推送）
     *
     * @param callbackContent@return "success"
     */
    ResponseDto<String> handleCouponCallback(CouponCallbackContent callbackContent);

    /**
     * 演出结束自动退款（定时任务调用）
     *
     * @param performancesId 演出ID
     * @return 处理结果摘要（成功/失败笔数）
     */
    ResponseDto<String> autoRefundByPerformance(String performancesId);

    /**
     * 查询用户收钱吧订单列表
     *
     * @param userId 用户ID
     * @return 收钱吧订单列表（仅 skuType=33 的订单，按下单时间倒序）
     */
    ResponseDto<List<GoblinSqbOrderDetailVo>> getOrderList(String userId);

    /**
     * 查询收钱吧订单详情
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 订单详情（基础信息 + 收钱吧扩展信息）
     */
    ResponseDto<GoblinSqbOrderDetailVo> getOrderDetail(String userId, String orderId);

    /**
     * 再次付款（待支付状态下重新拉起微信支付）
     *
     * @param userId  用户ID
     * @param orderId 本地订单ID
     * @return 新的 paymentVoucher（复用原 orderId）
     */
    ResponseDto<GoblinSqbOrderCreateVo> repay(String userId, String orderId);
}
