package com.narutohuo.xindazhou.common.auth.storage

import android.content.Context
import com.narutohuo.xindazhou.common.auth.utils.JWTUtil
import com.narutohuo.xindazhou.core.storage.StorageImpl

/**
 * Token 存储管理器
 * 
 * 负责 Token 的存储、读取和清除
 * 底层使用 base-core 的 StorageImpl 统一存储
 * 
 * 使用方式：
 * ```kotlin
 * // 在 Application 中初始化（StorageImpl 和 TokenStore 都需要初始化）
 * StorageImpl.init(context)
 * TokenStore.init(context)  // 可选，如果 StorageImpl 已初始化，这个可以省略
 * 
 * // 保存 Token
 * TokenStore.saveToken(accessToken, refreshToken, userId)
 * 
 * // 获取 Token
 * val token = TokenStore.getAccessToken()
 * 
 * // 清除 Token
 * TokenStore.clearToken()
 * ```
 */
object TokenStore {
    private const val KEY_ACCESS_TOKEN = "access_token"
    private const val KEY_REFRESH_TOKEN = "refresh_token"
    private const val KEY_USER_ID = "user_id"
    private const val KEY_SERVER_URL = "server_url"
    private const val KEY_SOCKET_URL = "socket_url"
    
    /**
     * 初始化 TokenStore（可选）
     * 
     * 如果 StorageImpl 已初始化，此方法可以省略
     * 
     * @param context 应用上下文
     */
    fun init(context: Context) {
        // 确保 StorageImpl 已初始化
        if (!StorageImpl.isInitialized()) {
            StorageImpl.init(context)
        }
    }
    
    /**
     * 保存Token
     * 
     * @param accessToken 访问令牌
     * @param refreshToken 刷新令牌
     * @param userId 用户ID
     */
    fun saveToken(accessToken: String, refreshToken: String, userId: Long) {
        StorageImpl.putString(KEY_ACCESS_TOKEN, accessToken)
        StorageImpl.putString(KEY_REFRESH_TOKEN, refreshToken)
        StorageImpl.putLong(KEY_USER_ID, userId)
    }
    
    /**
     * 获取Access Token
     * 
     * @return Access Token，如果不存在返回 null
     */
    fun getAccessToken(): String? {
        val token = StorageImpl.getString(KEY_ACCESS_TOKEN)
        return if (token.isEmpty()) null else token
    }
    
    /**
     * 获取Refresh Token
     * 
     * @return Refresh Token，如果不存在返回 null
     */
    fun getRefreshToken(): String? {
        val token = StorageImpl.getString(KEY_REFRESH_TOKEN)
        return if (token.isEmpty()) null else token
    }
    
    /**
     * 获取用户ID
     * 
     * @return 用户ID，如果不存在返回 0
     */
    fun getUserId(): Long {
        return StorageImpl.getLong(KEY_USER_ID)
    }
    
    /**
     * 判断是否已登录（仅检查 Access Token，不刷新）
     * 
     * 注意：此方法只检查 Access Token 是否存在且未过期，不会尝试刷新
     * 如果需要自动刷新功能，请使用 AuthManager.isLoggedInAsync()
     * 
     * 检查 Token 是否存在且未过期
     * 
     * @return true 表示已登录（有有效的 Access Token）
     */
    fun isLoggedIn(): Boolean {
        val token = getAccessToken()
        if (token.isNullOrEmpty()) {
            return false
        }
        // 检查 Token 是否过期（不刷新）
        return JWTUtil.isTokenValid(token)
    }
    
    /**
     * 清除Token（登出）
     */
    fun clearToken() {
        StorageImpl.remove(KEY_ACCESS_TOKEN)
        StorageImpl.remove(KEY_REFRESH_TOKEN)
        StorageImpl.remove(KEY_USER_ID)
    }
    
    /**
     * 保存服务器地址
     * 
     * @param url 服务器地址
     */
    fun saveServerUrl(url: String) {
        StorageImpl.putString(KEY_SERVER_URL, url)
    }
    
    /**
     * 获取服务器地址
     * 
     * @return 服务器地址，如果不存在返回 null
     */
    fun getServerUrl(): String? {
        val url = StorageImpl.getString(KEY_SERVER_URL)
        return if (url.isEmpty()) null else url
    }
    
    /**
     * 保存Socket地址
     * 
     * @param url Socket地址
     */
    fun saveSocketUrl(url: String) {
        StorageImpl.putString(KEY_SOCKET_URL, url)
    }
    
    /**
     * 获取Socket地址
     * 
     * @return Socket地址，如果不存在返回 null
     */
    fun getSocketUrl(): String? {
        val url = StorageImpl.getString(KEY_SOCKET_URL)
        return if (url.isEmpty()) null else url
    }
}

