package com.narutohuo.xindazhou.common.auth.utils

import android.util.Base64
import org.json.JSONObject

/**
 * JWT 工具类（客户端解析，不验证签名）
 * 
 * 用于解析 JWT Token 并检查是否过期
 * 注意：客户端不需要验证签名（签名验证由服务端完成），只需要解析 payload 检查 exp 字段
 */
object JWTUtil {
    
    /**
     * 解析 JWT Token 并检查是否过期
     * 
     * @param token JWT Token
     * @return true 如果 Token 未过期，false 如果过期或无法解析
     */
    fun isTokenValid(token: String?): Boolean {
        if (token.isNullOrEmpty()) {
            return false
        }
        
        // JWT 格式：header.payload.signature
        val parts = token.split(".")
        if (parts.size != 3) {
            return false
        }
        
        // 解析 payload（第二部分）
        val payload = parts[1]
        
        try {
            // Base64URL 解码
            val payloadBytes = base64UrlDecode(payload) ?: return false
            val payloadJson = JSONObject(String(payloadBytes))
            
            // 获取 exp 字段（过期时间，Unix 时间戳，单位：秒）
            if (!payloadJson.has("exp")) {
                return false
            }
            
            val exp = payloadJson.getLong("exp")
            
            // 检查是否过期（exp 是 Unix 时间戳，单位：秒）
            val currentTime = System.currentTimeMillis() / 1000 // 转换为秒
            return exp > currentTime
        } catch (e: Exception) {
            // 解析失败，认为 Token 无效
            return false
        }
    }
    
    /**
     * 解析 JWT Token 并获取过期时间
     * 
     * @param token JWT Token
     * @return 过期时间（Unix 时间戳，单位：秒），如果无法解析返回 null
     */
    fun getExpiresAt(token: String?): Long? {
        if (token.isNullOrEmpty()) {
            return null
        }
        
        // JWT 格式：header.payload.signature
        val parts = token.split(".")
        if (parts.size != 3) {
            return null
        }
        
        // 解析 payload（第二部分）
        val payload = parts[1]
        
        try {
            // Base64URL 解码
            val payloadBytes = base64UrlDecode(payload) ?: return null
            val payloadJson = JSONObject(String(payloadBytes))
            
            // 获取 exp 字段（过期时间，Unix 时间戳，单位：秒）
            if (!payloadJson.has("exp")) {
                return null
            }
            
            return payloadJson.getLong("exp")
        } catch (e: Exception) {
            // 解析失败
            return null
        }
    }
    
    /**
     * Base64URL 解码
     * 
     * Base64URL 是 Base64 的变体，用于 URL 安全：
     * - 将 '+' 替换为 '-'
     * - 将 '/' 替换为 '_'
     * - 移除填充字符 '='
     */
    private fun base64UrlDecode(base64Url: String): ByteArray? {
        return try {
            // 转换为标准 Base64
            var base64 = base64Url
                .replace("-", "+")
                .replace("_", "/")
            
            // 添加填充字符
            val remainder = base64.length % 4
            if (remainder > 0) {
                base64 += "=".repeat(4 - remainder)
            }
            
            // Base64 解码
            Base64.decode(base64, Base64.NO_WRAP)
        } catch (e: Exception) {
            null
        }
    }
}

