//package com.gh.gamecenter.common.loghub
//
//import com.aliyun.sls.android.producer.Log
//import com.aliyun.sls.android.producer.LogProducerClient
//import com.aliyun.sls.android.producer.LogProducerConfig
//import com.aliyun.sls.android.producer.LogProducerResult
//import com.gh.gamecenter.common.HaloApp
//import com.gh.gamecenter.common.utils.EnvHelper
//import com.gh.gamecenter.common.utils.PackageFlavorHelper
//import com.gh.gamecenter.core.AppExecutor
//import com.lightgame.utils.Utils
//
///**
// *  上传阿里云日志辅助类
// */
//object LoghubHelper {
//
//    private const val ACCESS_KEY_ID = "LTAIV3i0sNc4TPK1"
//    private const val ACCESS_KEY_SECRET = "8dKtTPeE5WYA6ZCeuIBcIVp7eB0ir4"
//    private const val ENDPOINT = "cn-qingdao.log.aliyuncs.com"
//
//    private val mClientMaps by lazy { hashMapOf<String, LogProducerClient>() }
//
//    /**
//     * 上传日志至阿里云 loghub
//     * @param uploadImmediately 马上上传日志
//     */
//    fun uploadLog(log: Log, logStore: String, uploadImmediately: Boolean) {
//        // https://github.com/aliyun/aliyun-log-android-sdk/issues/60
//        // 在主线程直接调用会有概率触发 ANR ，在工作线程调用有机率会创建多个工作线程，麻了，还是继续在工作线程上干吧
//        AppExecutor.logExecutor.execute {
//            getClient(logStore)?.addLog(log, if (uploadImmediately) 1 else 0)
//        }
//    }
//
//    private fun getClient(logStore: String): LogProducerClient? {
//        // https://jira.shanqu.cc/browse/GHZS-3815?focusedCommentId=50027&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-50027
//        //
//        val transformedLogStore = if (EnvHelper.isGATApp) "event" else logStore
//        if (!mClientMaps.containsKey(transformedLogStore)) {
//            mClientMaps[transformedLogStore] = createClient(transformedLogStore)
//        }
//        return mClientMaps[transformedLogStore]
//    }
//
//    private fun createClient(logStore: String): LogProducerClient {
//
//        val config = LogProducerConfig(
//            HaloApp.getInstance().applicationContext,
//            ENDPOINT,
//            EnvHelper.logProducerProject,
//            logStore,
//            ACCESS_KEY_ID,
//            ACCESS_KEY_SECRET
//        ).apply {
////            // 设置主题
////            setTopic("topic")
////            // 设置tag信息，此tag会附加在每条日志上
////            addTag("key", "value")
//            // 每个缓存的日志包的大小上限，取值为1~5242880，单位为字节。默认为1024 * 1024
//            setPacketLogBytes(1024 * 1024)
//            // 每个缓存的日志包中包含日志数量的最大值，取值为1~4096，默认为1024
//            setPacketLogCount(1024)
//            // 被缓存日志的发送超时时间，如果缓存超时，则会被立即发送，单位为毫秒，默认为3000
//            setPacketTimeout(3000)
//            // 单个Producer Client实例可以使用的内存的上限，超出缓存时add_log接口会立即返回失败
//            // 默认为64 * 1024 * 1024
//            setMaxBufferLimit(64 * 1024 * 1024)
//            // 发送线程数，默认为1
//            setSendThreadCount(1)
//
//            //网络连接超时时间，整数，单位秒，默认为10
//            setConnectTimeoutSec(15)
//            //日志发送超时时间，整数，单位秒，默认为15
//            setSendTimeoutSec(15)
//            //flusher线程销毁最大等待时间，整数，单位秒，默认为1
//            setDestroyFlusherWaitSec(2)
//            //sender线程池销毁最大等待时间，整数，单位秒，默认为1
//            setDestroySenderWaitSec(2)
//            //数据上传时的压缩类型，默认为LZ4压缩，0 不压缩，1 LZ4压缩，默认为1
//            setCompressType(1)
//            //设备时间与标准时间之差，值为标准时间-设备时间，一般此种情况用于客户端设备时间不同步的场景
//            //整数，单位秒，默认为0；比如当前设备时间为1607064208, 标准时间为1607064308，则值设置为 1607064308 - 1607064208 = 10
//            setNtpTimeOffset(0)
//            //日志时间与本机时间之差，超过该大小后会根据 `drop_delay_log` 选项进行处理。
//            //一般此种情况只会在设置persistent的情况下出现，即设备下线后，超过几天/数月启动，发送退出前未发出的日志
//            //整数，单位秒，默认为7*24*3600，即7天
//            setMaxLogDelayTime(7 * 24 * 3600)
//            //对于超过 `max_log_delay_time` 日志的处理策略
//            //0 不丢弃，把日志时间修改为当前时间; 1 丢弃，默认为 1 （丢弃）
//            setDropDelayLog(0)
//            //是否丢弃鉴权失败的日志，0 不丢弃，1丢弃
//            //默认为 0，即不丢弃
//            setDropUnauthorizedLog(0)
//            // 是否使用主线程回调
//            // false: 使用主线程回调。回调会在主线程上执行，且每个 client 都有自己单独的回调。
//            // true: 使用 sender 线程回调。回调会在 sender 线程上执行，每次执行回调时都会 attach 一个新的 java 线程，所有 client 共用一个回调。
//            // 注意：默认使用 sender 线程回调。
//            setCallbackFromSenderThread(true)
//
//            /**
//             * 以下为开启断点续传的配置, 按照如下配置开启断点续传功能后, 日志会先缓存到本地
//             */
//            // 1 开启断点续传功能， 0 关闭
//            // 每次发送前会把日志保存到本地的binlog文件，只有发送成功才会删除，保证日志上传At Least Once
//            setPersistent(1)
//            // 持久化的文件名，需要保证文件所在的文件夹已创建。
//            // !!!!!!!!!!!!!!!!!!!注意!!!!!!!!!!!!!!!!!!!
//            // 配置多个客户端时，不应设置相同文件
//            setPersistentFilePath(HaloApp.getInstance().filesDir.absolutePath + "/${logStore}.dat")
//            // 是否每次AddLog强制刷新，高可靠性场景建议打开
//            setPersistentForceFlush(1)
//            // 持久化文件滚动个数，建议设置成10。
//            setPersistentMaxFileCount(10)
//            // 每个持久化文件的大小，建议设置成1-10M
//            setPersistentMaxFileSize(1024 * 1024)
//            // 本地最多缓存的日志数，不建议超过1M，通常设置为65536即可
//            setPersistentMaxLogCount(65536)
//        }
//
//        // 通过 LogProducerConfig 构造一个 LogProducerClient 实例
//        // callback为可选配置, 如果不需要关注日志的发送成功或失败状态, 可以不注册 callback（正式环境不注册callback）
//        return if (!PackageFlavorHelper.IS_TEST_FLAVOR) {
//            LogProducerClient(config)
//        } else {
//            LogProducerClient(config) { resultCode, reqId, errorMessage, logBytes, compressedBytes ->
//                // resultCode       返回结果代码
//                // reqId            请求id
//                // errorMessage     错误信息，没有为null
//                // logBytes         日志大小
//                // compressedBytes  压缩后日志大小
//                Utils.log(
//                    "LoghubHelper -> ${
//                        String.format(
//                            "%s %s %s %s %s",
//                            LogProducerResult.fromInt(resultCode),
//                            reqId,
//                            errorMessage,
//                            logBytes,
//                            compressedBytes
//                        )
//                    }"
//                )
//            }
//        }
//    }
//}
