package com.narutohuo.xindazhou.common.network

import com.narutohuo.xindazhou.common.config.ServerConfigManager
import com.narutohuo.xindazhou.common.network.NetworkManager
import com.narutohuo.xindazhou.common.network.NetworkConfig
import com.narutohuo.xindazhou.core.log.ILog
import retrofit2.Retrofit

/**
 * API 管理器（object 单例，统一使用类名直接调用）
 * 
 * 统一创建和管理 API 接口实例，避免重复代码
 * 整合了网络配置和 API 接口创建功能
 * 
 * 使用方式（完全懒加载，第一次使用时自动初始化）：
 * ```kotlin
 * // 创建 API 接口实例（第一次调用时自动初始化）
 * val authApi = ApiManager.create<AuthApi>()
 * 
 * // 设置 Token 提供器（可选，通常由 AuthManager 自动设置）
 * ApiManager.setTokenProvider { TokenManager.getAccessToken() }
 * ```
 */
object ApiManager {
    
    @PublishedApi
    internal val TAG = "ApiManager"
    
    @PublishedApi
    internal var cachedBaseURL: String? = null
    @PublishedApi
    internal var isInitialized = false
    
    /**
     * baseUrl 提供器（内部使用，自动从 ServerConfigManager 读取）
     */
    private var baseUrlProvider: (() -> String)? = null
    
    /**
     * 确保已初始化（懒加载，第一次使用时自动初始化）
     */
    @PublishedApi
    internal fun ensureInitialized() {
        if (isInitialized) {
            return
        }
        
        synchronized(this) {
            if (isInitialized) {
                return
            }
            
            ILog.d(TAG, "ApiManager 懒加载初始化...")
            
            // 从 ServerConfigManager 读取服务器地址
            val serverURL = ServerConfigManager.getHttpServerUrl()
            cachedBaseURL = serverURL
            
            // 自动设置 baseURLProvider 返回缓存的地址
            this.baseUrlProvider = {
                cachedBaseURL ?: serverURL
            }
            
            // 检测调试模式（使用默认值 false，如果需要可以从全局获取）
            val isDebug = false
            
            // 初始化底层网络管理器（使用统一的 NetworkManager）
            NetworkManager.init(
                NetworkConfig.Builder()
                    .baseUrl(serverURL)
                    .isDebug(isDebug)
                    .enableLogging(isDebug)
                    .build()
            )
            
            isInitialized = true
            ILog.d(TAG, "ApiManager 懒加载初始化完成，baseURL: $serverURL")
        }
    }
    
    /**
     * 刷新 BaseURL（从存储重新读取）
     * 
     * 当服务器地址在存储中更新后，可以调用此方法刷新
     */
    @JvmStatic
    fun refreshBaseURL() {
        val serverURL = ServerConfigManager.getHttpServerUrl()
        cachedBaseURL = serverURL
        ILog.d(TAG, "BaseURL 已刷新: $serverURL")
    }
    
    /**
     * 创建 API 接口实例（工厂方法）
     * 
     * @param baseUrl 基础URL，如果为 null 则使用 baseUrlProvider
     * @return API 接口实例
     * @throws IllegalStateException 如果 baseUrl 和 baseUrlProvider 都未设置
     */
    @JvmStatic
    inline fun <reified T> create(baseUrl: String? = null): T {
        ensureInitialized()  // 懒加载初始化
        
        // 如果传入了 baseUrl，需要先重置 NetworkManager（切换服务器地址）
        if (baseUrl != null) {
            val currentBaseURL = getBaseUrlForCreate()
            if (baseUrl != currentBaseURL) {
                // baseUrl 改变了，需要重置 NetworkManager 并重新初始化
                ILog.d(TAG, "检测到 baseUrl 变化: $currentBaseURL -> $baseUrl，重新初始化 NetworkManager")
                handleBaseUrlChange(baseUrl)
            }
        }
        
        // 使用 NetworkManager 创建 Retrofit 实例（使用 defaultConfig）
        val retrofit = NetworkManager.getRetrofit()  // 不传入 config，使用 defaultConfig
        
        return retrofit.create(T::class.java)
    }
    
    /**
     * 处理 baseUrl 变化（内部方法，用于切换服务器地址）
     */
    @PublishedApi
    internal fun handleBaseUrlChange(newBaseUrl: String) {
        NetworkManager.reset()
        NetworkManager.init(
            NetworkConfig.Builder()
                .baseUrl(newBaseUrl)
                .isDebug(false)
                .enableLogging(false)
                .build()
        )
        cachedBaseURL = newBaseUrl
        baseUrlProvider = { newBaseUrl }
    }
    
    /**
     * 获取 baseUrl（供 create() 使用）
     */
    @PublishedApi
    internal fun getBaseUrlForCreate(): String {
        return baseUrlProvider?.invoke() ?: cachedBaseURL
            ?: throw IllegalStateException(
                "baseUrl 未设置。请设置 ApiManager.baseUrlProvider 或在 create() 中传入 baseUrl 参数"
            )
    }
    
    /**
     * 使用指定的 Retrofit 实例创建 API 接口实例
     * 
     * @param retrofit Retrofit 实例
     * @return API 接口实例
     */
    @JvmStatic
    inline fun <reified T> create(retrofit: Retrofit): T {
        return retrofit.create(T::class.java)
    }
    
    /**
     * 设置 Token 提供器
     * 
     * 用于自动在请求头中添加 Authorization Token
     * 通常由 AuthManager 自动调用，无需手动设置
     * 
     * @param tokenProvider Token 提供器，返回当前的 accessToken
     */
    @JvmStatic
    fun setTokenProvider(tokenProvider: () -> String?) {
        NetworkManager.tokenProvider = tokenProvider
        ILog.d(TAG, "Token 提供器已设置")
    }
    
    /**
     * 重置网络管理器（用于切换服务器地址时）
     * 
     * 清空已缓存的 Retrofit 和 OkHttpClient 实例，下次使用时会重新创建
     */
    @JvmStatic
    fun reset() {
        NetworkManager.reset()
        isInitialized = false
        cachedBaseURL = null
        ILog.d(TAG, "网络管理器已重置")
    }
}

