package com.narutohuo.xindazhou.common.network

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

/**
 * API 管理器
 * 
 * 统一创建和管理 API 接口实例，避免重复代码
 * 
 * 与 AuthManager、SocketIOManager 类似，提供统一的 API 封装
 * 自动处理配置初始化、URL 刷新等，外部只需要调用 create() 即可
 * 
 * 使用方式：
 * ```kotlin
 * // 在 AppInitializer 中初始化（自动从 ServerConfigManager 读取服务器地址）
 * ApiManager.initialize(application)
 * 
 * // 然后就可以直接使用，无需再设置 baseUrl
 * val authApi = ApiManager.create<AuthApi>()
 * 
 * // 或者使用自定义 baseUrl
 * val authApi = ApiManager.create<AuthApi>("https://api.example.com")
 * ```
 */
object ApiManager {
    
    private const val TAG = "ApiManager"
    
    private var cachedBaseURL: String? = null
    private var isInitialized = false
    
    /**
     * baseUrl 提供器（默认配置）
     * 
     * 在 initialize() 中自动设置，从 ServerConfigManager 读取服务器地址
     * 也可以手动设置自定义提供器
     * 
     * 示例：
     * ```kotlin
     * ApiManager.baseUrlProvider = { 
     *     ServerConfigManager.getHttpServerUrl() 
     * }
     * ```
     */
    var baseUrlProvider: (() -> String)? = null
    
    /**
     * 初始化 API 管理器（从存储读取服务器地址）
     * 
     * 自动从 ServerConfigManager 读取服务器地址并缓存，同时初始化 NetworkHelper
     * 自动检测调试模式，所有参数使用默认值，业务层只需一行代码即可完成初始化
     * 
     * @param application Application 实例（用于检测调试模式）
     */
    fun initialize(application: android.app.Application) {
        if (isInitialized) {
            LogHelper.d(TAG, "已初始化，跳过")
            return
        }
        
        // 从 ServerConfigManager 读取服务器地址
        val serverURL = ServerConfigManager.getHttpServerUrl()
        cachedBaseURL = serverURL
        
        // 设置 baseURLProvider 返回缓存的地址
        this.baseUrlProvider = {
            cachedBaseURL ?: serverURL
        }
        
        // 自动检测调试模式
        val isDebug = try {
            val buildConfigClass = Class.forName("${application.packageName}.BuildConfig")
            val debugField = buildConfigClass.getField("DEBUG")
            debugField.getBoolean(null)
        } catch (e: Exception) {
            LogHelper.e(TAG, "无法获取 BuildConfig.DEBUG，默认返回 false", e)
            false
        }
        
        // 同时初始化 NetworkHelper（使用相同的 baseURL）
        NetworkHelper.init(
            baseUrl = serverURL,
            isDebug = isDebug,
            enableLogging = isDebug
        )
        
        isInitialized = true
        LogHelper.d(TAG, "初始化完成，baseURL: $serverURL, isDebug: $isDebug")
    }
    
    /**
     * 刷新 BaseURL（从存储重新读取）
     * 
     * 当服务器地址在存储中更新后，可以调用此方法刷新
     */
    fun refreshBaseURL() {
        val serverURL = ServerConfigManager.getHttpServerUrl()
        cachedBaseURL = serverURL
        LogHelper.d(TAG, "BaseURL 已刷新: $serverURL")
    }
    
    /**
     * 创建 API 接口实例（工厂方法）
     * 
     * @param baseUrl 基础URL，如果为 null 则使用 baseUrlProvider
     * @return API 接口实例
     * @throws IllegalStateException 如果 baseUrl 和 baseUrlProvider 都未设置
     */
    inline fun <reified T> create(baseUrl: String? = null): T {
        // 优先级：传入的 baseUrl > baseUrlProvider > 抛出异常
        val url = baseUrl ?: baseUrlProvider?.invoke()
            ?: throw IllegalStateException(
                "baseUrl 未设置。请先调用 ApiManager.initialize() " +
                "或 ApiManager.baseUrlProvider = { ... } " +
                "或在 create() 中传入 baseUrl 参数"
            )
        
        // 使用 NetworkManager 创建 Retrofit 实例
        val retrofit = NetworkManager.getRetrofit(
            com.narutohuo.xindazhou.core.network.NetworkConfig.Builder()
                .baseUrl(url)
                .build()
        )
        
        return retrofit.create(T::class.java)
    }
    
    /**
     * 使用指定的 Retrofit 实例创建 API 接口实例
     * 
     * @param retrofit Retrofit 实例
     * @return API 接口实例
     */
    inline fun <reified T> create(retrofit: Retrofit): T {
        return retrofit.create(T::class.java)
    }
}

