package app.dudu.pay

import app.dudu.net.DuduApi
import kotlinx.coroutines.delay

/** 支付结果。 */
sealed class PayResult {
    data object Success : PayResult()
    data object Cancelled : PayResult()
    data class Failed(val reason: String) : PayResult()
}

/** 微信 APP 支付抽象：拉起收银台，返回用户侧支付结果（最终以服务端订单态为准）。 */
interface PayClient {
    /**
     * @param orderId   服务端订单号（mock 链路用；真实微信支付只用 payParams）
     * @param payParams POST /v1/orders 返回的 app 支付参数（appid/partnerid/prepayid/...）
     */
    suspend fun pay(orderId: String, payParams: Map<String, Any?>): PayResult
}

/**
 * Mock 实现：延迟 2 秒模拟用户在微信收银台完成支付，然后调 dev server 的
 * POST /v1/pay/notify（明文 mock 回调）把订单置为 paid——这样上层"轮询订单至 paid"
 * 的真实链路完整可走。
 *
 * TODO(wechat-pay): 用户拿到 2B 商户号后替换为微信 OpenSDK 实现：
 *  1. IWXAPI.sendReq(PayReq().apply { appId/partnerId/prepayId/packageValue/
 *     nonceStr/timeStamp/sign = payParams[...] })
 *  2. 新建 wxapi/WXPayEntryActivity，onResp 的 BaseResp.errCode：
 *     0 → Success；-2 → Cancelled；其余 → Failed
 *  3. 服务端回调由微信直达 /v1/pay/notify，删除 DuduApi.mockPayNotify
 */
class MockPayClient : PayClient {
    override suspend fun pay(orderId: String, payParams: Map<String, Any?>): PayResult {
        delay(2000) // 模拟收银台停留
        val amount = (payParams["amount"] as? Number)?.toInt() ?: 0
        DuduApi.mockPayNotify(orderId, amount) // 触发 dev server 入账（失败也继续，轮询会给出结论）
        return PayResult.Success
    }
}

/** 装配点：换真实 SDK 时只改这一行。 */
val payClient: PayClient = MockPayClient()
