package com.duben.heliapp.manager

import android.app.Application
import android.text.TextUtils
import com.bytedance.ads.convert.BDConvert
import com.bytedance.applog.AppLog
import com.bytedance.applog.IDataObserver
import com.bytedance.applog.InitConfig
import com.bytedance.applog.util.UriConstants
import com.bytedance.hume.readapk.HumeSDK
import com.duben.heliapp.BuildConfig
import com.duben.heliapp.MintsApplication
import com.duben.heliapp.utils.LogUtil
import com.duben.heliapp.utils.MateUtils.getAppMetaData
import org.json.JSONObject


/**
 * CsjAppLogManager
 */
object CsjAppLogManager {

    // 获取方式，穿山甲平台-Adspark-免费广告监测-应用管理创建
    const val APP_LOG_ID = "643487"

    fun init(application: Application) {
        // 第一个参数APPID: 参考2.1节获取
        // 第二个参数CHANNEL: 填写渠道信息，请注意不能为空
        val config = InitConfig(APP_LOG_ID, createChannel())
        // 设置数据上送地址
        config.setUriConfig(UriConstants.DEFAULT)
        config.isImeiEnable = false //建议关停获取IMEI（出于合规考虑）
        config.isAutoTrackEnabled = false // 全埋点开关，true开启，false关闭
        config.isLogEnable = BuildConfig.LOG_DEBUG // true:开启日志，参考4.3节设置logger，false:关闭日志
        AppLog.setEncryptAndCompress(true) // 加密开关，true开启，false关闭
        config.setEnablePlay(true) // 配置心跳事件（时长统计）
        /**
         * 用于获取用户唯一性bd_did
         * @description
         */
        AppLog.addDataObserver(object : IDataObserver {
            /**
             * 本地的id数据加载结果通知
             * @param did device id
             * @param iid install id
             * @param ssid ssid
             */
            override fun onIdLoaded(s: String, s1: String, s2: String) {}

            /**
             * 通知注册结果，以及id变化情况
             * 仅主进程会被调用
             * @param changed 是否和本地缓存有所不同
             * @param oldDid 原device id
             * @param newDid server返回新的device id
             * @param oldIid 原install id
             * @param newIid server返回新install id
             * @param oldSsid 原ssid
             * @param newSsid server返回新ssid
             */
            override fun onRemoteIdGet(
                b: Boolean,
                s: String?,
                s1: String,
                s2: String,
                s3: String,
                s4: String,
                s5: String
            ) {
                val bd_did = AppLog.getDid()
                LogUtil.d("mcg --> 用户唯一性bd_did=" + bd_did)
            }

            /**
             * Config拉取数据，和本地数据对比有变化的通知
             * 仅主进程会被调用
             * @param changed 是否和本地缓存有所不同
             * @param config server返回新config内容
             */
            override fun onRemoteConfigGet(b: Boolean, jsonObject: JSONObject?) {}

            /**
             * server拉取AbConfig数据，和本地数据对比有变化的通知
             * 仅主进程会被调用
             * @param changed 是否和本地缓存有所不同
             * @param abConfig server返回新abConfig内容
             */
            override fun onRemoteAbConfigGet(b: Boolean, jsonObject: JSONObject) {
                LogUtil.d("mcg -->---测试---返回全部进组信息", "" + jsonObject.toString())
            }

            /**
             * Vid变化通知
             */
            override fun onAbVidsChange(s: String, s1: String) {}
        })
        //SDK会采集OAID、ANDROID_ID和其他的设备特征字段，请遵循相关合规要求在隐私弹窗后采集
        //传入需要init的AppLog实例，若没有多个AppLog实例，则传入AppLog.getInstance()即可
        BDConvert.getInstance().init(application, AppLog.getInstance())
        // 如果在 onCreate 阶段初始化拿不到 XXXActivity 则不需要传递第三个参数
        AppLog.init(application, config)
        // 请在用户授权后调用如下方法，start 开始实际采集用户信息+上报：
        AppLog.start()
        // 在初始化后必须设置AppLog.setHeaderInfo("csj_attribution",1)，否则会直接影响归因结果。
        AppLog.setHeaderInfo("csj_attribution", 1)
    }


    /**
     * 创建渠道
     *
     * @return
     */
    private fun createChannel(): String {
        var channel = getAppMetaData(MintsApplication.getContext(), "CHANNEL_NAME")
        try {
            // 穿山甲分包渠道
            val ttChannel = HumeSDK.getChannel(MintsApplication.getContext())
            if (!TextUtils.isEmpty(ttChannel)) {
                // 此处方式不能修改，已和后端约定
                channel = channel + "_" + ttChannel
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return channel
    }


    object GrownEventType {
        //注册
        const val REGISTER = "grown_attribution_event_register"

        //付费
        const val PURCHASE = "grown_attribution_event_purchase"

        //关键行为
        const val KEY_BEHAVIOR = "grown_attribution_event_key_behavior"

        //下单
        const val ORDER = "grown_attribution_event_order"

        //下载
        const val DOWNLOAD = "grown_attribution_event_download"

        //应用内拉起
        const val DEEPLINK = "grown_attribution_event_deelink"

        //授权
        const val AUTHORIZATION = "grown_attribution_event_authorization"

        //广告变现
        const val AD_PURCHASE = "grown_attribution_event_ad_purchase"

        //次留
        const val RETENTION_2D = "grown_attribution_event_retention_2d"

        //添加购物车
        const val ADD_TO_CART = "grown_attribution_event_add_to_cart"

        //表单提交
        const val FORM_SUBMIT = "grown_attribution_event_form_submit"

        //拉活
        const val APP_RE_ACTIVE_WAKE_UP = "grown_attribution_event_app_re_active_wake_up"

        //自定义激活
        const val CUSTOM_ACTIVITION = "grown_attribution_event_custom_activition"

        //自定义注册
        const val CUSTOM_REGISTER = "grown_attribution_event_custom_register"
    }

    fun event(v: String) {
        //方式一,穿山甲
        AppLog.onEventV3(v)

//        //方式二,自定义
//        val paramsObj = JSONObject()
//        try {
//            paramsObj.put("key_string", "value_string")
//            paramsObj.put("key_int", 10)
//        } catch (e: Exception) {
//            e.printStackTrace()
//        }
//        AppLog.onEventV3(GrownEventType.PURCHASE, paramsObj)
    }
}