package com.liquidnet.service.goblin.service;

import com.liquidnet.service.goblin.param.shouqianba.callback.CallbackParams;
import com.liquidnet.service.goblin.param.shouqianba.request.*;
import com.liquidnet.service.goblin.param.shouqianba.response.data.*;

import java.util.List;
import java.util.Map;

/**
 * 收钱吧对接接口定义
 *
 * @author liquidnet
 * @since 2026-03-16
 */
public interface IGoblinShouQianBaService {

    /**
     * 创建结算明细
     * <p>
     * 对接收钱吧「创建结算明细」接口，向收钱吧上传订单结算数据。
     * </p>
     *
     * @param request 创建结算明细请求参数
     * @return 收钱吧响应结果；调用失败时返回 null
     */
    SettlementCreateData createSettlement(SettlementCreateRequest request);

    /**
     *
     * @param mallSn 商城ID
     * @param signature 商城密钥
     * @param userId 正在用户ID
     * @param checkoutItems 商品
     * @return
     */
    SettlementCreateData createSettlement(String mallSn, String signature, String userId, List<SettlementCreateRequest.CheckoutItem> checkoutItems);

    /**
     * 创建订单
     * 
     * @param request
     * @return
     */
    OrderCreateData createOrder(OrderCreateRequest request);

    /**
     *
     * @param mallSn 商城ID
     * @param signature 商城密钥
     * @param checkoutItemsId  创建结算明细 返回的 结算项ID
     * @param userId 正在用户ID
     * @param requestId 请求ID
     * @param subject  标题
     * @return
     */
    OrderCreateData createOrder(String mallSn, String signature, String checkoutItemsId, String userId, String requestId, String subject);

    /**
     * 创建收单
     * 如果上一步创建收单失败 可以使用这个接口重新创建收单
     * 
     * @return
     */
    AcquiringCreateData createAcquiring(AcquiringCreateRequest request);

    /**
     * 查询收银台
     * 
     * @param request
     * @return
     */
    CashierQueryData queryCashier(CashierQueryRequest request);

    /**
     * 查询收银台
     * @param acquiringSn 收单号
     * @param acquiringSignature 收单密钥
     * @param userId 正在用户ID
     * @return
     */
    CashierQueryData queryCashier(String acquiringSn, String acquiringSignature, String userId);

    /**
     * 创建微信预支付订单
     * 
     * @param request
     * @return
     */
    CreateWechatPrepayOrderData createWechatPrepayOrder(CreateWechatPrepayOrderRequest request);

    /**
     * 创建微信预支付订单
     *
     * @param acquiringSn 收单号
     * @param signature 收单签名
     * @param userId 正在用户ID
     * @param amount 支付金额
     * @param requestSn 支付请求号
     * @param payTool 支付工具代码
     * @param channelExt 通道扩展参数
     * @param selectedSignature 支付工具签名
     * @param seq 序列号 上一步seq（查询收银台）
     * @return
     */
    CreateWechatPrepayOrderData createWechatPrepayOrder(String acquiringSn,
                                                        String signature,
                                                        String userId,
                                                        String amount,
                                                        String requestSn,
                                                        CashierQueryData.PayTool payTool,
                                                        Map<String, Object> channelExt,
                                                        String selectedSignature,
                                                        String seq);

    /**
     * 查询券码
     * 
     * @param request
     * @return
     */
    CouponQueryData queryCoupon(CouponQueryRequest request);

    /**
     * 查询券码
     * @param sn 订单ID
     * @param signature 订单密码
     * @return
     */
    CouponQueryData queryCoupon(String sn, String signature);

    /**
     * 券码状态同步
     * 
     * @param request
     * @return
     */
    boolean syncCouponStatus(CouponStatusSyncRequest request);

    /**
     * 券码状态同步
     * @param redeemMerchantId 用户ID（自定义，核销用户id）
     * @param voucherNos 券号
     * @param redeemExternalOrderSn 外部单号（${AppCode}+id，AppCode需要分配）
     * @param clientSn 核销终端号（自定义）
     * @param status 券使用状态（0未核销，1已核销）
     * @return
     */
    boolean syncCouponStatus(String redeemMerchantId,
                             List<String> voucherNos,
                             String redeemExternalOrderSn,
                             String clientSn,
                             Byte status);

    /**
     * 券退款
     * 
     * @param request
     * @return
     */
    CouponRefundData refundCoupon(CouponRefundRequest request);

    /**
     * @param sn           单号（前置操作后拿到）
     * @param signature    密码（前置操作后拿到）
     * @param applyAmount  金额
     * @param type         退款类型（1商品 2金额）
     * @param item
     * @param refundReason 退款原因
     * @param requestId    退款请求id（${AppCode}+id）
     * @return
     */
    CouponRefundData refundCoupon(String sn,
                                  String signature,
                                  Long applyAmount,
                                  Byte type,
                                  List<CouponRefundRequest.RefundItem> item,
                                  String refundReason,
                                  String requestId);

    /**
     * 商城列表接口
     *
     * @param request
     * @return
     */
    List<MallListQueryData> queryMallList(MallListQueryRequest request);

    /**
     *
     * @param endCursor 结束游标 上一页的结束游标（首次查询传 null）
     * @param count 查询数量 每页返回的最大订单数
     * @return
     */
    List<MallListQueryData> queryMallList(String endCursor, Integer count);

    /**
     * 商城商品接口
     *
     * @param request
     * @return
     */
    List<MallProductsQueryData> queryMallProducts(MallProductsQueryRequest request);

    /**
     * 商城商品接口
     * @param mallSn 商城ID
     * @param signature 商城密码
     * @return
     */
    List<MallProductsQueryData> queryMallProducts(String mallSn, String signature);

    /**
     * 验签
     * @param callbackParams
     * @return
     */
    boolean verifySignature(CallbackParams callbackParams);
}
