package com.jishisongfu.duobibi.auth

import android.app.Activity
import android.content.Context
import android.util.Log
import cn.jiguang.verifysdk.api.JVerificationInterface
import cn.jiguang.verifysdk.api.LoginSettings
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume

/**
 * 一键登录的 suspend 包装。三个核心步骤:
 *   1) [checkEnable]    判断当前网络环境是否支持一键登录(蜂窝数据 + 三大运营商之一)
 *   2) [preLogin]       预取号:跟运营商建联 + 拿临时令牌,有效期 10~30 分钟,
 *                       缓存命中可显著加速 loginAuth 的授权页拉起
 *   3) [loginAuth]      拉起授权页,用户点同意 → 拿 loginToken,上传给后端换手机号
 *
 * 错误码:
 *   - preLogin   7000=成功, 其他失败(常见 2002 蜂窝不可用 / 2003 取号超时)
 *   - loginAuth  6000=成功(content=loginToken), 6001=失败, 6002=用户取消, 其他见文档
 */
object OneClickLogin {

    private const val TAG = "DUOBIBI-AUTH"

    fun checkEnable(context: Context): Boolean =
        JVerificationInterface.checkVerifyEnable(context)

    suspend fun preLogin(context: Context, timeoutMs: Int = 5_000): Result<Unit> =
        suspendCancellableCoroutine { cont ->
            if (!JVerificationInterface.isInitSuccess()) {
                cont.resume(Result.failure(IllegalStateException("JG SDK 未初始化")))
                return@suspendCancellableCoroutine
            }
            // 3.1.7 的 PreLoginListener.onResult 是 3 参:(code, content, operatorReturn)
            // 显式 label cb 避免跟外层 suspend fun preLogin 同名冲突
            JVerificationInterface.preLogin(context, timeoutMs) cb@ { code, content, _ ->
                Log.i(TAG, "preLogin code=$code content=$content")
                // 协程已被 cancel(用户切后台/退页) 或 SDK 重复回调时,跳过 resume 防 IllegalStateException
                if (!cont.isActive) return@cb
                if (code == 7000) cont.resume(Result.success(Unit))
                else cont.resume(Result.failure(RuntimeException("preLogin [$code] $content")))
            }
        }

    suspend fun loginAuth(activity: Activity, timeoutMs: Int = 15_000): Result<AuthOk> =
        suspendCancellableCoroutine { cont ->
            // SDK 每次 loginAuth 完成/取消后会清空 UIConfig 缓存,导致下次回到默认 UI
            // (现象:首次绑定自定义样式 → 解绑再绑回到 SDK 默认丑界面)。每次 loginAuth
            // 前补一次 set,保证 UI 永远是我们配置的样式。
            JgInit.applyUiConfig()

            val settings = LoginSettings().apply {
                setAutoFinish(true)
                setTimeout(timeoutMs)
            }
            JVerificationInterface.loginAuth(activity, settings) cb@ { code, content, operator, _ ->
                Log.i(TAG, "loginAuth code=$code operator=$operator")
                // 协程已被 cancel 或 SDK 重复回调时,跳过 resume 防 IllegalStateException
                if (!cont.isActive) return@cb
                if (code == 6000) {
                    cont.resume(Result.success(AuthOk(loginToken = content, operator = operator ?: "")))
                } else {
                    cont.resume(Result.failure(RuntimeException("loginAuth [$code] $content")))
                }
            }
        }

    data class AuthOk(val loginToken: String, val operator: String)
}
