// 支付抽象（14B）：购买流只依赖"用 pay_params 拉起收银台"这一步，SDK 可整体替换。
// TODO(wechat-pay): 商户号就绪后新增 WechatPayClient：WXApi.sendReq(PayReq(
// partnerId/prepayId/nonceStr/timeStamp/sign…均来自 pay_params))，onResp 回调返回；
// 支付结果仍以订单轮询（GET /v1/orders/{id} → paid）为准，与本 mock 流程一致。
import Foundation

protocol PayClient {
    /// 拉起支付。返回即代表用户完成了支付动作；成败以订单轮询为准。
    func pay(orderID: String, amountCents: Int, params: [String: JSONValue]) async throws
}

/// 开发期 mock：2 秒后模拟支付成功。
/// 连本机后端时补发 POST /v1/pay/notify（对齐 billing.MockPay 的明文回调），
/// 让订单真实流转到 paid；离线 MockApi 模式下 notify 是空操作，订单自行到 paid。
struct MockPay: PayClient {
    func pay(orderID: String, amountCents: Int, params: [String: JSONValue]) async throws {
        try await Task.sleep(nanoseconds: 2_000_000_000)
        try? await Api.client.mockPayNotify(orderID: orderID, amountCents: amountCents)
    }
}
