package com.narutohuo.xindazhou.common.networkrx.interceptor

import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response

/**
 * Token刷新拦截器（基于RxJava）
 * 
 * 处理Token过期的自动刷新
 * 
 * 功能：
 * - 检测Token过期
 * - 自动刷新Token
 * - 重试失败的请求
 * - 线程安全处理
 * 
 * 使用方式：
 * ```kotlin
 * val client = NetworkManager.createOkHttpClient(TokenRefreshInterceptor())
 * ```
 */
class TokenRefreshInterceptor : Interceptor {
    
    // 锁对象，用于线程同步
    private val lock = Any()
    
    // 是否正在刷新Token
    private var isRefreshing = false
    
    // 刷新后的新Token
    private var newToken: String? = null
    
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request)
        
        // 检查是否需要刷新Token
        if (isTokenExpired(response)) {
            synchronized(lock) {
                // 双重检查，避免重复刷新
                if (!isRefreshing) {
                    isRefreshing = true
                    try {
                        // 刷新Token
                        newToken = refreshToken()
                        if (!newToken.isNullOrEmpty()) {
                            // 保存新Token
                            saveToken(newToken!!)
                        }
                    } finally {
                        isRefreshing = false
                    }
                } else {
                    // 等待Token刷新完成
                    while (isRefreshing) {
                        Thread.sleep(100)
                    }
                }
            }
            
            // 使用新Token重新请求
            if (!newToken.isNullOrEmpty()) {
                val newRequest = request.newBuilder()
                    .header("Authorization", "Bearer $newToken")
                    .build()
                return chain.proceed(newRequest)
            }
        }
        
        return response
    }
    
    /**
     * 检查Token是否过期
     * 
     * @param response 响应
     * @return 是否过期
     */
    private fun isTokenExpired(response: Response): Boolean {
        // 检查HTTP状态码
        if (response.code == 401) {
            return true
        }
        
        // 检查响应体中的错误码
        try {
            val responseBody = response.peekBody(1024 * 1024).string()
            // 这里可以根据实际的响应格式检查错误码
            // 例如："code": 401, "message": "Token expired"
            return responseBody.contains("Token expired") || responseBody.contains("\"code\": 401")
        } catch (e: Exception) {
            e.printStackTrace()
        }
        
        return false
    }
    
    /**
     * 刷新Token
     * 
     * @return 新Token
     */
    private fun refreshToken(): String? {
        // 实际项目中应调用刷新Token的API
        // 这里模拟刷新Token
        try {
            // 模拟网络请求延迟
            Thread.sleep(1000)
            return "new_token_" + System.currentTimeMillis()
        } catch (e: Exception) {
            e.printStackTrace()
            return null
        }
    }
    
    /**
     * 保存Token
     * 
     * @param token 新Token
     */
    private fun saveToken(token: String) {
        // 实际项目中应保存到安全存储
        // 例如：SharedPreferences、EncryptedSharedPreferences等
    }
}