package com.ydl.component.base


import android.app.Application
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Looper
import android.os.Process
import androidx.annotation.RequiresApi
import android.util.Log
import com.channel.ydl_flutter_base.plugin.YDLCommonPlugin
import com.facebook.stetho.Stetho
import com.meituan.android.walle.WalleChannelReader
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.smtt.sdk.QbSdk
import com.umeng.analytics.MobclickAgent
import com.umeng.commonsdk.UMConfigure
import com.umeng.socialize.PlatformConfig
import com.umeng.socialize.UMShareAPI
import com.ydl.component.BuildConfig
import com.ydl.component.MainActivity
import com.ydl.media.audio.PlayService
import com.ydl.ydlcommon.actions.crash.Cockroach
import com.ydl.ydlcommon.actions.crash.ExceptionHandler
import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.base.config.YDLConstants
import com.ydl.ydlcommon.base.delegate.IAppLifecycles
import com.ydl.ydlcommon.utils.AppProgressUtils
import com.ydl.ydlcommon.utils.LogUtil
import com.ydl.ydlcommon.utils.YdlBuryPointUtil
import com.ydl.ydlcommon.utils.log.LogHelper
import com.yidianling.common.tools.ToastUtil
import com.yidianling.im.config.NimApplication
import io.flutter.view.FlutterMain
import io.reactivex.functions.Action

/**
 * Created by haorui on 2019-09-02.
 * Des:
 */
class DemoAppLifecycles : IAppLifecycles {

    override fun attachBaseContext(base: Context) {

    }

    @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    override fun onCreate(application: Application) {
        //模块初始化
        moduleInit(application)
        if (AppProgressUtils.isMainProcess(application)) {
            //第三方SDK初始化
            initThirdServiceSDK(application)
            //Flutter 初始化需要在主线程中执行
            FlutterMain.startInitialization(application)
            YDLCommonPlugin.pluginDelegate = object:YDLCommonPlugin.CommonPluginDelegate  {
                override fun getAppTheme(): HashMap<String, String> {
                    val map = HashMap<String, String>()
                    map["platform_main_theme"] = "#34CD65"
                    return map
                }

                override fun getSubChannelTheme(channelName: String): ArrayList<Any> {
                    val channelTheme = arrayListOf<Any>()
                    val items = mutableMapOf<String, String>()
                    items["index"] = "1"
                    items["type"] = "sort"
                    channelTheme.add(items)
                    return channelTheme
                }
            }
            //        FlutterMain.ensureInitializationComplete(application, null);
            //
            //        FlutterEngine flutterEngine = new FlutterEngine(application);
            //        flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
            //        YDLCommonPlugin plugin = new YDLCommonPlugin();
            //        flutterEngine.getLocalizationChannel().channel.setMethodCallHandler(plugin);

            val intent = Intent(application, PlayService::class.java)
            application.startService(intent)
            //            application.registerActivityLifecycleCallbacks(new CoursePlayLifecycle());

            Stetho.initializeWithDefaults(application)
        }
    }

    override fun onTerminate(application: Application) {}

    private fun moduleInit(application: Application) {
        NimApplication.getInstance().initIm(application, MainActivity::class.java)
    }


    private fun initThirdServiceSDK(application: Application) {
        object : Thread() {
            override fun run() {
                super.run()
                //设置线程优先级,不与主线程抢资源
                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)

                //子线程中初始化X5内核,防止ANR问题
                initX5(application)

                if (DemoGlobalConfig.appEnv == YDLConstants.ENV_PROD) {
                    //                    YDLavManager.Companion.getInstances().init(application, "3387e9b251f3491e9221a9877e8f7830");
                } else {
                    //                    YDLavManager.Companion.getInstances().init(application, "13b1536698f64905a1e7e5bb978ba821");
                }

                //异常拦截
                installCockroach(application)
                //bugly
                val packageName = application.packageName
                var channel = WalleChannelReader.getChannel(application)
                if (channel == null || channel == "null") {
                    channel = "test"
                }
                val strategy = CrashReport.UserStrategy(application)
                strategy.appChannel = channel
                val appkey = if (BuildConfig.DEBUG) "630a3a5cea" else "3939e71afa"
//                CrashReport.initCrashReport(application, appkey, BuildConfig.DEBUG, strategy)

                //umeng
                var umAppkey: String? = null
                if (BuildConfig.FLAVOR.endsWith("ydl")) {
                    umAppkey = "56970affe0f55a9cda001e24"
                    channel = "android_$channel"
                    initUM(umAppkey, channel, application)
                    PlatformConfig.setWeixin(
                        "wx57a9d930270498c7",
                        "17c031f02500ded3457a80e69d8e5e45"
                    )
                    PlatformConfig.setQQZone("1105070461", "6BvkUnk6wXJekcgR")
                } else if (BuildConfig.FLAVOR.endsWith("xlzx")) {
                    umAppkey = "5859e1656e27a42fa400021f"
                    channel = "ATK_7_android_$channel"
                    initUM(umAppkey, channel, application)
                    PlatformConfig.setWeixin(
                        "wx1c6af5a11b5f531f",
                        "1ddb93abbb2d81e604657d38e94a5720"
                    )
                    PlatformConfig.setQQZone("1107931541", "8dCvxUpi525uPGTJ")
                }

                // 选用AUTO页面采集模式
                MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO)
                MobclickAgent.setCatchUncaughtExceptions(!BuildConfig.DEBUG)

                //开启友盟集成测试
                UMConfigure.setLogEnabled(BuildConfig.DEBUG)
                HttpConfig.getInstance().initSocketConfig(Action {
                    //数据埋点初始化 (一定要放在主进程中/因为用到了umeng统计,需要放在umeng初始化后)
                    YdlBuryPointUtil.init(application, true)
                })
                //安全检测
                //YDLAppProtector.init();

            }
        }.start()
    }


    private fun initUM(umAppKey: String?, channel: String?, application: Application) {
        /**
         * 初始化common库
         * 参数1:上下文,不能为空
         * 参数2:友盟 app key
         * 参数3:友盟 channel
         * 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
         * 参数5:Push推送业务的secret
         */
        UMConfigure.init(application, umAppKey, channel, UMConfigure.DEVICE_TYPE_PHONE, null)
        UMShareAPI.init(application, umAppKey)
    }


    /**
     * 初始化X5内核
     *
     * @param application
     */
    private fun initX5(application: Application) {
        // 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案
        //        HashMap map = new HashMap();
        //        map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
        //        QbSdk.initTbsSettings(map);

        //        if (!QbSdk.isTbsCoreInited()) {//// preinit只需要调用一次,如果已经完成了初始化,那么就直接构造view
        //            QbSdk.preInit(application, null);// 设置X5初始化完成的回调接口
        //        }

        val cb = object : QbSdk.PreInitCallback {

            override fun onViewInitFinished(arg0: Boolean) {
                //初始化完成回调
                LogUtil.i("QbSdk onViewInitFinished:$arg0")
            }

            override fun onCoreInitFinished() {
                LogUtil.i("QbSdk onCoreInitFinished")
            }
        }
        QbSdk.initX5Environment(application, cb)

    }

    /**
     * 初始化异常拦截器
     */
    private fun installCockroach(application: Application) {
        val sysExcepHandler = Thread.getDefaultUncaughtExceptionHandler()
        Cockroach.install(application, object : ExceptionHandler() {
            override fun onUncaughtExceptionHappened(thread: Thread, throwable: Throwable) {
                if (BuildConfig.DEBUG) {
                    ToastUtil.toastShort(throwable.message)
                }

                LogHelper.getInstance().writeLogSync(throwable.localizedMessage)
                LogHelper.getInstance().uploadLog(false)
            }

            override fun onBandageExceptionHappened(throwable: Throwable) {
                throwable.printStackTrace()//打印警告级别log,该throwable可能是最开始的bug导致的,无需关心
                LogHelper.getInstance().writeLogSync(throwable.localizedMessage)
            }

            override fun onEnterSafeMode() {}

            override fun onMayBeBlackScreen(e: Throwable?) {
                val thread = Looper.getMainLooper().thread
                Log.e("AndroidRuntime", "--->onUncaughtExceptionHappened:$thread<---", e)
                //黑屏时建议直接杀死app
                sysExcepHandler.uncaughtException(thread, RuntimeException("black screen"))

                LogHelper.getInstance().writeLogSync(e!!.localizedMessage)
            }
        })
    }

}