package com.narutohuo.xindazhou.common.util

import com.alibaba.android.arouter.launcher.ARouter
import com.narutohuo.xindazhou.core.log.ILog
import com.narutohuo.xindazhou.core.util.IUtil

/**
 * 工具管理器
 * 
 * 业务层封装，提供便捷的工具方法调用方式
 * 内部使用 IUtil 接口（由 app 模块实现）
 * 
 * 使用方式：
 * ```kotlin
 * // 时间处理
 * val timeStr = UtilManager.formatTime(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")
 * val timestamp = UtilManager.parseTime("2024-01-01 12:00:00", "yyyy-MM-dd HH:mm:ss")
 * 
 * // 字符串处理
 * val encrypted = UtilManager.encryptString("原始数据")
 * val decrypted = UtilManager.decryptString(encrypted)
 * val md5Hash = UtilManager.md5("原始数据")
 * 
 * // 数据转换
 * val json = UtilManager.toJson(user)
 * val user = UtilManager.fromJson<User>(json, User::class.java)
 * ```
 */
object UtilManager {
    
    internal const val TAG = "UtilManager"
    
    /**
     * 获取 IUtil 实现实例
     * 通过 ARouter 获取，如果未注册则返回 null
     */
    fun getUtil(): IUtil? {
        return try {
            ARouter.getInstance().navigation(IUtil::class.java)
        } catch (e: Exception) {
            ILog.w(TAG, "IUtil 未注册，请确保 app 模块已实现并注册 IUtil")
            null
        }
    }
    
    // ========== 时间处理 ==========
    
    /**
     * 格式化时间
     * 
     * @param timestamp 时间戳（毫秒）
     * @param pattern 格式模式（如 "yyyy-MM-dd HH:mm:ss"）
     * @return 格式化后的时间字符串
     */
    fun formatTime(timestamp: Long, pattern: String): String {
        return getUtil()?.formatTime(timestamp, pattern) ?: run {
            ILog.w(TAG, "formatTime 失败：IUtil 未注册")
            ""
        }
    }
    
    /**
     * 解析时间字符串
     * 
     * @param timeString 时间字符串
     * @param pattern 格式模式（如 "yyyy-MM-dd HH:mm:ss"）
     * @return 时间戳（毫秒），如果解析失败返回 null
     */
    fun parseTime(timeString: String, pattern: String): Long? {
        return getUtil()?.parseTime(timeString, pattern) ?: run {
            ILog.w(TAG, "parseTime 失败：IUtil 未注册")
            null
        }
    }
    
    // ========== 字符串处理 ==========
    
    /**
     * 加密字符串
     * 
     * @param data 原始数据
     * @return 加密后的字符串
     */
    fun encryptString(data: String): String {
        return getUtil()?.encryptString(data) ?: run {
            ILog.w(TAG, "encryptString 失败：IUtil 未注册")
            data
        }
    }
    
    /**
     * 解密字符串
     * 
     * @param data 加密后的数据
     * @return 解密后的字符串
     */
    fun decryptString(data: String): String {
        return getUtil()?.decryptString(data) ?: run {
            ILog.w(TAG, "decryptString 失败：IUtil 未注册")
            data
        }
    }
    
    /**
     * MD5 哈希
     * 
     * @param data 原始数据
     * @return MD5 哈希值
     */
    fun md5(data: String): String {
        return getUtil()?.md5(data) ?: run {
            ILog.w(TAG, "md5 失败：IUtil 未注册")
            ""
        }
    }
    
    // ========== 数据转换 ==========
    
    /**
     * 对象转 JSON
     * 
     * @param obj 对象
     * @return JSON 字符串
     */
    inline fun <reified T> toJson(obj: T): String {
        return getUtil()?.toJson(obj) ?: run {
            ILog.w("UtilManager", "toJson 失败：IUtil 未注册")
            ""
        }
    }
    
    /**
     * JSON 转对象
     * 
     * @param json JSON 字符串
     * @param clazz 目标类型
     * @return 对象，如果解析失败返回 null
     */
    inline fun <reified T> fromJson(json: String, clazz: Class<T>): T? {
        return getUtil()?.fromJson(json, clazz) ?: run {
            ILog.w("UtilManager", "fromJson 失败：IUtil 未注册")
            null
        }
    }
    
    /**
     * JSON 转对象（简化版，使用 reified 泛型）
     * 
     * @param json JSON 字符串
     * @return 对象，如果解析失败返回 null
     */
    inline fun <reified T> fromJson(json: String): T? {
        return fromJson(json, T::class.java)
    }
}

