package com.narutohuo.xindazhou.share.factory

import android.content.Context
import com.alibaba.android.arouter.launcher.ARouter
import com.narutohuo.xindazhou.core.log.ILog
import com.narutohuo.xindazhou.share.api.ShareService
import com.narutohuo.xindazhou.share.impl.ShareServiceImpl
import com.narutohuo.xindazhou.share.model.ShareConfig

/**
 * 分享服务工厂类
 * 
 * 提供统一的获取分享服务实例和初始化的方式
 * 分享服务是全局单例，多个界面共享同一个分享服务实例
 * 
 * 内部使用 ARouter 获取服务，实现 base-core 与 share 模块的解耦
 * 
 * 使用示例：
 * ```kotlin
 * // 方式1：使用默认配置（从资源文件读取）
 * ShareServiceFactory.init(context = this)
 * 
 * // 方式2：使用自定义配置
 * ShareServiceFactory.init(
 *     context = this,
 *     config = ShareConfig(
 *         umengAppKey = "您的友盟 AppKey",
 *         weChatConfig = WeChatConfig(appId = "...", appSecret = "...")
 *     )
 * )
 * 
 * // 方式3：部分自定义配置（其他从资源文件读取）
 * ShareServiceFactory.init(
 *     context = this,
 *     config = ShareConfig(
 *         umengChannel = "production"  // 只覆盖渠道，其他从资源文件读取
 *     )
 * )
 * 
 * // 获取服务实例（单例）
 * val shareService = ShareServiceFactory.getInstance()
 * 
 * // 创建分享内容（使用 Builder 模式）
 * val content = ShareContent.builder()
 *     .setTitle("分享标题")
 *     .setDescription("分享描述")
 *     .setUrl("https://example.com")
 *     .setImageUrl("https://example.com/image.jpg")
 *     .build()
 * 
 * // 分享到微信
 * shareService.shareToWeChat(activity, content) { response ->
 *     if (response.success) {
 *         Log.d("Share", "分享成功")
 *     } else {
 *         Log.e("Share", "分享失败: ${response.errorMessage}")
 *     }
 * }
 * ```
 */
object ShareServiceFactory {
    
    /**
     * 初始化分享服务（使用默认配置）
     * 
     * 从资源文件（strings.xml）读取配置，需要在 strings.xml 中定义：
     * - share_umeng_app_key（必填）
     * - share_umeng_channel（可选，默认为 "developer-default"）
     * - share_wechat_app_id, share_wechat_app_secret（可选）
     * - share_qq_app_id, share_qq_app_key（可选）
     * - share_weibo_app_key, share_weibo_app_secret, share_weibo_redirect_url（可选）
     * 
     * 在 Application.onCreate() 中调用，统一初始化分享服务
     * 只需要调用一次，后续通过 getInstance() 获取服务实例即可
     * 
     * @param context Application 上下文
     */
    @JvmStatic
    fun init(context: Context) {
        val config = ShareConfig.fromResources(context)
        val service = ShareServiceImpl.getInstance()
        service.initialize(context, config)
    }
    
    /**
     * 初始化分享服务（使用自定义配置）
     * 
     * 如果 config 中的参数为 null，会从资源文件读取默认值
     * 例如：如果 umengAppKey 为 null，会从 strings.xml 中读取 share_umeng_app_key
     * 
     * 在 Application.onCreate() 中调用，统一初始化分享服务
     * 只需要调用一次，后续通过 getInstance() 获取服务实例即可
     * 
     * @param context Application 上下文
     * @param config 分享服务配置（可选参数会从资源文件读取默认值）
     */
    @JvmStatic
    fun init(context: Context, config: ShareConfig) {
        // 合并配置：优先使用传入的 config，缺失的参数从资源文件读取
        val defaultConfig = ShareConfig.fromResources(context)
        val mergedConfig = ShareConfig(
            umengAppKey = config.umengAppKey ?: defaultConfig.umengAppKey,
            umengChannel = if (config.umengChannel != "developer-default" || defaultConfig.umengChannel == "developer-default") {
                config.umengChannel
            } else {
                defaultConfig.umengChannel
            },
            weChatConfig = config.weChatConfig ?: defaultConfig.weChatConfig,
            qqConfig = config.qqConfig ?: defaultConfig.qqConfig,
            weiboConfig = config.weiboConfig ?: defaultConfig.weiboConfig
        )
        
        val service = ShareServiceImpl.getInstance()
        service.initialize(context, mergedConfig)
    }
    
    /**
     * 获取分享服务实例（单例）
     * 
     * 优先通过 ARouter 获取服务，如果获取不到，则回退到直接实例化
     * 注意：使用前需要先调用 init() 进行初始化
     * 
     * @return ShareService实例（单例）
     */
    @JvmStatic
    fun getInstance(): ShareService {
        // 优先通过 ARouter 获取服务（实现解耦）
        try {
            val arouterService = ARouter.getInstance().build("/share/service").navigation() as? ShareService
            if (arouterService != null) {
                ILog.d("ShareServiceFactory", "通过 ARouter 获取分享服务")
                return arouterService
            }
        } catch (e: Exception) {
            // ARouter 可能还未完全初始化，捕获异常并回退
            ILog.w("ShareServiceFactory", "ARouter 获取服务失败，回退到直接实例化: ${e.message}")
        }
        
        // 回退到直接实例化（向后兼容）
        ILog.d("ShareServiceFactory", "使用直接实例化")
        return ShareServiceImpl.getInstance()
    }
}
