package com.lukouguoji.module_base

import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import com.alibaba.android.arouter.launcher.ARouter
import com.cretin.www.cretinautoupdatelibrary.model.TypeConfig
import com.cretin.www.cretinautoupdatelibrary.model.UpdateConfig
import com.cretin.www.cretinautoupdatelibrary.utils.AppUpdateUtils
import com.cretin.www.cretinautoupdatelibrary.utils.SSLUtils.TrustAllHostnameVerifier
import com.lukouguoji.module_base.handler.MyCrashHandler
import com.lukouguoji.module_base.util.DeviceUtil
import com.lukouguoji.module_base.util.OkHttp3Connection
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import dev.DevUtils
import me.jessyan.autosize.AutoSizeConfig
import me.jessyan.autosize.onAdaptListener
import okhttp3.OkHttpClient
import timber.log.Timber
import java.util.concurrent.TimeUnit


class MyApplication : Application() {

    //ARouter debug开关：true-open;false-close
    private val isDebugARouter = false

    companion object {
        lateinit var context: Context
        fun startLogin() {
            val intent = Intent(context, LoginActivity::class.java) //LOGIN为注册表里添加
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
            context.startActivity(intent)
        }
    }

    override fun onCreate() {
        super.onCreate()
        context = applicationContext
        //错误采集
        Thread.setDefaultUncaughtExceptionHandler(MyCrashHandler())
        // 1.必须在init之前调用
        if (isDebugARouter) {
            // These two lines must be written before init, otherwise these configurations will be invalid in the init process
            ARouter.openLog();     // Print log
            ARouter.openDebug();   // Turn on debugging mode (If you are running in InstantRun mode, you must turn on debug mode! Online version needs to be closed, otherwise there is a security risk)
        }
        // 2.初始化
        ARouter.init(this) // As early as possible, it is recommended to initialize in the Application

//        initAppUpdateUtils()

        // 全局设置刷新头尾布局
        SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, _ ->
            return@setDefaultRefreshHeaderCreator ClassicsHeader(context)
        }
        SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ ->
            return@setDefaultRefreshFooterCreator ClassicsFooter(context)
        }

        Timber.plant(Timber.DebugTree())
        DevUtils.init(this)
        initAutoSizeConfig()
    }

    private fun initAutoSizeConfig(){
        AutoSizeConfig.getInstance().setOnAdaptListener(object : onAdaptListener {
            override fun onAdaptBefore(target: Any, activity: Activity) {
                //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                //首先设置最新的屏幕尺寸，ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application !!!
                AutoSizeConfig.getInstance()
                    .setScreenWidth(activity.resources.displayMetrics.widthPixels)
                AutoSizeConfig.getInstance()
                    .setScreenHeight(activity.resources.displayMetrics.heightPixels)
                //根据屏幕方向，设置设计尺寸
                if (activity.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                    //设置横屏设计尺寸（平板）
                    AutoSizeConfig.getInstance()
                        .setDesignWidthInDp(DeviceUtil.TABLET_DESIGN_WIDTH_DP_LAND)
                        .setDesignHeightInDp(DeviceUtil.TABLET_DESIGN_HEIGHT_DP_LAND)
                } else {
                    if(activity.javaClass.simpleName.startsWith("PictureSelectorSupporterActivity")){
                        AutoSizeConfig.getInstance()
                            .setDesignWidthInDp(360)
                        .setDesignHeightInDp(480)
                    } else if (DeviceUtil.isPhone(activity)) {
                        //手机竖屏：按 5.5 寸手持端设计稿画布 390 × 844 换算
                        //若沿用平板竖屏的 720 × 1280 基准，手机上所有 dp 会被压缩约一半，布局全部错位
                        AutoSizeConfig.getInstance()
                            .setDesignWidthInDp(DeviceUtil.PHONE_DESIGN_WIDTH_DP)
                            .setDesignHeightInDp(DeviceUtil.PHONE_DESIGN_HEIGHT_DP)
                    } else {
                        //设置竖屏设计尺寸（平板）
                        AutoSizeConfig.getInstance()
                            .setDesignWidthInDp(DeviceUtil.TABLET_DESIGN_WIDTH_DP_PORT)
                            .setDesignHeightInDp(DeviceUtil.TABLET_DESIGN_HEIGHT_DP_PORT)
                    }
                }
            }

            override fun onAdaptAfter(target: Any, activity: Activity) {
            }
        })
    }


    /**
     * 初始化app更新工具
     */
    private fun initAppUpdateUtils() {
        //如果你想使用okhttp作为下载的载体，那么你需要自己依赖okhttp，更新库不强制依赖okhttp！可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator start
        val builder = OkHttpClient.Builder()
        builder.connectTimeout(30000, TimeUnit.SECONDS)
            .readTimeout(30000, TimeUnit.SECONDS)
            .writeTimeout(30000, TimeUnit.SECONDS) //如果你需要信任所有的证书，可解决根证书不被信任导致无法下载的问题 start
            .hostnameVerifier(TrustAllHostnameVerifier()) //如果你需要信任所有的证书，可解决根证书不被信任导致无法下载的问题 end
            .retryOnConnectionFailure(true)
        //如果你想使用okhttp作为下载的载体，那么你需要自己依赖okhttp，更新库不强制依赖okhttp！可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator end

        //更新库配置
        val updateConfig = UpdateConfig()
//            .setBaseUrl("")
            .setDebug(true) //是否是Debug模式
            .setDataSourceType(TypeConfig.DATA_SOURCE_TYPE_MODEL) //设置获取更新信息的方式
            .setShowNotification(true)//配置更新的过程中是否在通知栏显示进度
            .setNotificationIconRes(R.mipmap.ic_launcher)//配置通知栏显示的图标
            .setShowNotification(true) //配置更新的过程中是否在通知栏显示进度
            .setUiThemeType(TypeConfig.UI_THEME_L) //配置UI的样式，一种有12种样式可供选择
            .setRequestHeaders(null) //当dataSourceType为DATA_SOURCE_TYPE_URL时，设置请求的请求头
            .setRequestParams(null) //当dataSourceType为DATA_SOURCE_TYPE_URL时，设置请求的请求参数
            .setAutoDownloadBackground(false) //是否需要后台静默下载，如果设置为true，则调用checkUpdate方法之后会直接下载安装，不会弹出更新页面。当你选择UI样式为TypeConfig.UI_THEME_CUSTOM，静默安装失效，您需要在自定义的Activity中自主实现静默下载，使用这种方式的时候建议setShowNotification(false)，这样基本上用户就会对下载无感知了
            .setNeedFileMD5Check(false) //是否需要进行文件的MD5检验，如果开启需要提供文件本身正确的MD5校验码，DEMO中提供了获取文件MD5检验码的工具页面，也提供了加密工具类Md5Utils
            .setCustomDownloadConnectionCreator(OkHttp3Connection.Creator(builder)) //如果你想使用okhttp作为下载的载体，可以使用如下代码创建一个OkHttpClient，并使用demo中提供的OkHttp3Connection构建一个ConnectionCreator传入，在这里可以配置信任所有的证书，可解决根证书不被信任导致无法下载apk的问题
        //初始化
        AppUpdateUtils.init(this, updateConfig)
    }

}