package com.mints.goodmoney.ui.activitys

import android.app.Activity
import android.os.Handler
import android.os.Looper
import android.text.TextUtils
import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.mints.goodmoney.MintsApplication
import com.mints.goodmoney.R
import com.mints.goodmoney.common.Constant
import com.mints.goodmoney.common.DeviceInfo
import com.mints.goodmoney.manager.UserManager
import com.mints.goodmoney.manager.YlhAdManager
import com.mints.goodmoney.ui.activitys.base.BaseActivity
import com.mints.goodmoney.utils.LogUtil
import com.mints.library.utils.CommonUtils
import com.qq.e.ads.splash.SplashAD
import com.qq.e.ads.splash.SplashADListener
import com.qq.e.comm.util.AdError
import com.yilan.sdk.ui.little.YLLittleVideoFragment
import net.grandcentrix.tray.AppPreferences

/**
 * 启动页 开屏展示
 */
class SplashYlhActivity : BaseActivity(), SplashADListener {

    companion object {
        private const val SKIP_TEXT = "点击跳过 %d"
    }

    private var splashAD: SplashAD? = null
    private var container: ViewGroup? = null
    private val skipView: TextView? = null
    private val ps by lazy { AppPreferences(context) }

    var canJump = false

    /**
     * 为防止无广告时造成视觉上类似于"闪退"的情况，设定无广告时页面跳转根据需要延迟一定时间，demo
     * 给出的延时逻辑是从拉取广告开始算开屏最少持续多久，仅供参考，开发者可自定义延时逻辑，如果开发者采用demo
     * 中给出的延时逻辑，也建议开发者考虑自定义minSplashTimeWhenNoAD的值（单位ms）
     */
    private val minSplashTimeWhenNoAD = 3000

    /**
     * 记录拉取广告的时间
     */
    private var fetchSplashADTime: Long = 0
    private val handler = Handler(Looper.getMainLooper())

    override fun getContentViewLayoutID(): Int {
        return R.layout.activity_splash_ylh
    }

    override fun initViewsAndEvents() {
        if (!isTaskRoot) {
            //点击Home键后再点击App图标，会回到原来的界面。今天重新打包后，但是在Debug模式下，一切正常，
            // 但是把打完包的apk（Release）安装在其他手机上时，回到桌面后点击图标会重新打开启动页
            finish()
            return
        }
        // 校验APP签名
        checkAppSign()

        // 预加载好兔视频
        YLLittleVideoFragment.preloadVideo()
    }

    override fun isApplyKitKatTranslucency(): Boolean {
        return false
    }

    override fun onPause() {
        super.onPause()
        canJump = false
    }

    override fun onResume() {
        super.onResume()
        if (canJump) {
            next()
        }
        canJump = true
    }

    override fun onDestroy() {
        super.onDestroy()
        handler.removeCallbacksAndMessages(null)
    }

    /**
     * 校验App签名
     */
    private fun checkAppSign() {
        val deviceInfo: DeviceInfo = DeviceInfo.instance!!
        if (!deviceInfo.signInfo) {
            baseApplication.exitApp()
        } else {
            YLLittleVideoFragment.preloadVideo()
            try {
                container = findViewById<View>(R.id.splash_container) as ViewGroup
                fetchSplashAD(this, container, skipView, YlhAdManager.YLH_AD_SPLASH_POSTID, this, 0)
            } catch (e: Exception) {
                readyGoOtherActivity()
            }
        }
    }

    /**
     * 拉取开屏广告，开屏广告的构造方法有3种，详细说明请参考开发者文档。
     *
     * @param activity      展示广告的activity
     * @param adContainer   展示广告的大容器
     * @param skipContainer 自定义的跳过按钮：传入该view给SDK后，SDK会自动给它绑定点击跳过事件。SkipView的样式可以由开发者自由定制，其尺寸限制请参考activity_splash.xml或者接入文档中的说明。
     * @param posId         广告位ID
     * @param adListener    广告状态监听器
     * @param fetchDelay    拉取广告的超时时长：取值范围[3000, 5000]，设为0表示使用广点通SDK默认的超时时长。
     */
    private fun fetchSplashAD(activity: Activity, adContainer: ViewGroup?, skipContainer: View?,
                              posId: String, adListener: SplashADListener, fetchDelay: Int) {
        fetchSplashADTime = System.currentTimeMillis()
        splashAD = SplashAD(activity, skipContainer, posId, adListener, fetchDelay)
        splashAD!!.fetchAndShowIn(adContainer)
    }

    override fun onADPresent() {
    }

    override fun onADClicked() {
    }

    /**
     * 倒计时回调，返回广告还将被展示的剩余时间。
     * 通过这个接口，开发者可以自行决定是否显示倒计时提示，或者还剩几秒的时候显示倒计时
     *
     * @param millisUntilFinished 剩余毫秒数
     */
    override fun onADTick(millisUntilFinished: Long) {
        skipView?.setText(String.format(SKIP_TEXT, Math.round(millisUntilFinished / 1000f)))
    }

    override fun onADExposure() {
    }

    override fun onADLoaded(expireTimestamp: Long) {
    }

    override fun onADDismissed() {
        next()
    }

    override fun onNoAD(error: AdError) {
        val str = String.format("LoadSplashADFail, eCode=%d, errorMsg=%s", error.errorCode,
                error.errorMsg)
        LogUtil.d("AD_DEMO", str)
        /**
         * 为防止无广告时造成视觉上类似于"闪退"的情况，设定无广告时页面跳转根据需要延迟一定时间，demo
         * 给出的延时逻辑是从拉取广告开始算开屏最少持续多久，仅供参考，开发者可自定义延时逻辑，如果开发者采用demo
         * 中给出的延时逻辑，也建议开发者考虑自定义minSplashTimeWhenNoAD的值
         */
        val alreadyDelayMills = System.currentTimeMillis() - fetchSplashADTime //从拉广告开始到onNoAD已经消耗了多少时间
        val shouldDelayMills = if (alreadyDelayMills > minSplashTimeWhenNoAD) 0 else minSplashTimeWhenNoAD - alreadyDelayMills //为防止加载广告失败后立刻跳离开屏可能造成的视觉上类似于"闪退"的情况，根据设置的minSplashTimeWhenNoAD
        // 计算出还需要延时多久
        handler.postDelayed({ readyGoOtherActivity() }, shouldDelayMills.toLong())
    }

    /**
     * 设置一个变量来控制当前开屏页面是否可以跳转，当开屏广告为普链类广告时，点击会打开一个广告落地页，此时开发者还不能打开自己的App主页。当从广告落地页返回以后，
     * 才可以跳转到开发者自己的App主页；当开屏广告是App类广告时只会下载App。
     */
    private operator fun next() {
        if (canJump) {
            readyGoOtherActivity()
            finish()
        } else {
            canJump = true
        }
    }

    /**
     * 开屏页一定要禁止用户对返回按钮的控制，否则将可能导致用户手动退出了App而广告无法正常曝光和计费
     */
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return if (keyCode == KeyEvent.KEYCODE_BACK) {
            true
        } else super.onKeyDown(keyCode, event)
    }

    private fun readyGoOtherActivity() {
        val customVersion: Int = ps.getInt(Constant.CUSTOM_VERSION, 0)
        val isFirstEnter: Boolean = ps.getBoolean(Constant.ISFIRSTENTER + customVersion, true)
        if (isFirstEnter) {
            readyGoThenKill(GuideActivity::class.java)
        } else {
            val channel = CommonUtils.getAppMetaData(MintsApplication.getContext(), "CHANNEL_NAME")
            if (TextUtils.equals(channel, Constant.CHANNEL_SHARE) && !UserManager.getInstance().userIsLogin()) {
                readyGo(LoginActivity::class.java)
            } else {
                readyGoThenKill(MainActivity::class.java)
            }
        }
    }
}