package com.narutohuo.xindazhou.core.log

/**
 * 日志级别枚举
 */
enum class LogLevel {
    DEBUG,    // 调试信息
    INFO,     // 一般信息
    WARN,     // 警告信息
    ERROR     // 错误信息
}

/**
 * 日志服务接口
 * 统一封装日志记录、日志文件管理、日志上传、崩溃收集
 * 
 * 实现类：TimberLog（开发环境）、NoOpLog（生产环境）
 */
interface ILogger {
    /**
     * 调试日志
     */
    fun d(tag: String, message: String)
    
    /**
     * 信息日志
     */
    fun i(tag: String, message: String)
    
    /**
     * 警告日志
     */
    fun w(tag: String, message: String)
    
    /**
     * 错误日志
     */
    fun e(tag: String, message: String, throwable: Throwable? = null)
    
    /**
     * 按级别记录日志
     * 
     * @param level 日志级别
     * @param tag 标签
     * @param message 消息
     * @param throwable 异常（可选）
     */
    fun log(level: LogLevel, tag: String, message: String, throwable: Throwable? = null)
    
    /**
     * 上传日志文件
     */
    fun uploadLogs()
    
    /**
     * 收集崩溃信息
     */
    fun collectCrash(throwable: Throwable)
}

/**
 * 日志工具类（类似 Android Log 类）
 * 
 * 所有SDK模块通过静态方法进行日志记录
 * 
 * **实现选择**：
 * - **开发环境**（Debug）：使用 TimberLog（输出详细日志）
 * - **生产环境**（Release）：使用 NoOpLog（不输出日志，提升性能）
 * 
 * **使用示例**：
 * ```kotlin
 * // 1. 在 Application 中初始化（推荐）
 * // Debug 版本自动启用日志，Release 版本自动禁用
 * ILog.init(enableLogging = BuildConfig.DEBUG)
 * 
 * // 2. 静态方法调用（推荐，类似 Android Log.d()）
 * ILog.d("Tag", "调试信息")
 * ILog.e("Tag", "错误信息", exception)
 * 
 * // 3. 手动控制（可选）
 * ILog.init(enableLogging = false) // 生产环境禁用日志
 * ILog.init(enableLogging = true)   // 开发环境启用日志
 * ```
 */
object ILog {
    @Volatile
    private var instance: ILogger? = null
    
    /**
     * 初始化日志实现（在 Application 中调用，可选）
     * 
     * **自动选择实现**：
     * - 如果 `enableLogging = true`（默认）：使用 TimberLog（开发环境）
     * - 如果 `enableLogging = false`：使用 NoOpLog（生产环境，不输出日志）
     * 
     * **使用示例**：
     * ```kotlin
     * // 方式1：自动选择（推荐）
     * // Debug 版本自动启用日志，Release 版本自动禁用
     * ILog.init(enableLogging = BuildConfig.DEBUG)
     * 
     * // 方式2：手动指定实现
     * ILog.init(com.narutohuo.xindazhou.core.log.impl.NoOpLog.getInstance()) // 生产环境
     * ILog.init(com.narutohuo.xindazhou.core.log.impl.TimberLog.getInstance()) // 开发环境
     * ```
     * 
     * @param enableLogging 是否启用日志（默认 true）
     * @param logImpl 自定义日志实现（可选，如果指定则忽略 enableLogging 参数）
     */
    @JvmStatic
    fun init(enableLogging: Boolean = true, logImpl: ILogger? = null) {
        instance = when {
            logImpl != null -> logImpl // 如果指定了自定义实现，优先使用
            enableLogging -> com.narutohuo.xindazhou.core.log.impl.TimberLog.getInstance() // 启用日志
            else -> com.narutohuo.xindazhou.core.log.impl.NoOpLog.getInstance() // 禁用日志（生产环境）
        }
    }
    
    /**
     * 初始化日志实现（使用自定义实现）
     * 
     * @param logImpl 自定义日志实现
     */
    @JvmStatic
    fun init(logImpl: ILogger) {
        instance = logImpl
    }
    
    /**
     * 获取日志实现实例（单例）
     * 
     * 如果未初始化，默认使用 TimberLog（开发环境）
     * 生产环境建议在 Application 中调用 init() 进行初始化
     */
    private fun getInstance(): ILogger {
        if (instance == null) {
            synchronized(this) {
                if (instance == null) {
                    // 默认使用 TimberLog（开发环境）
                    // 生产环境建议在 Application 中调用 init(enableLogging = false)
                    instance = com.narutohuo.xindazhou.core.log.impl.TimberLog.getInstance()
                }
            }
        }
        return instance!!
    }
    
    /**
     * 调试日志（静态方法）
     */
    @JvmStatic
    fun d(tag: String, message: String) {
        getInstance().d(tag, message)
    }
    
    /**
     * 信息日志（静态方法）
     */
    @JvmStatic
    fun i(tag: String, message: String) {
        getInstance().i(tag, message)
    }
    
    /**
     * 警告日志（静态方法）
     */
    @JvmStatic
    fun w(tag: String, message: String) {
        getInstance().w(tag, message)
    }
    
    /**
     * 错误日志（静态方法）
     */
    @JvmStatic
    fun e(tag: String, message: String, throwable: Throwable? = null) {
        getInstance().e(tag, message, throwable)
    }
    
    /**
     * 按级别记录日志（静态方法）
     */
    @JvmStatic
    fun log(level: LogLevel, tag: String, message: String, throwable: Throwable? = null) {
        getInstance().log(level, tag, message, throwable)
    }
    
    /**
     * 上传日志文件（静态方法）
     */
    @JvmStatic
    fun uploadLogs() {
        getInstance().uploadLogs()
    }
    
    /**
     * 收集崩溃信息（静态方法）
     */
    @JvmStatic
    fun collectCrash(throwable: Throwable) {
        getInstance().collectCrash(throwable)
    }
}

