package com.base.appzxhy.ui.splash

import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.View
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.appzxhy.SpConstObject.ifAgreePrivacy
import com.base.appzxhy.GlobalConfig.URL_PRIVACY
import com.base.appzxhy.MyApplication
import com.base.appzxhy.R
import com.base.appzxhy.SpConstObject.isGuided
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.business.helper.EventUtils
import com.base.appzxhy.business.service.StayJobService.Companion.startStayJobService
import com.base.appzxhy.databinding.ActivitySplashBinding
import com.base.appzxhy.ui.guide.GuideCleanActivity
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.utils.UmpUtils
import java.util.concurrent.atomic.AtomicBoolean

@SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding::inflate) {

    private val viewModel: SplashViewModel by viewModels()

    override fun useDefaultImmersive() {
        setStatusBarColor()
        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
            insets
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        initUMP()
        super.onCreate(savedInstanceState)
    }

    override fun onResumeOneShoot() {
        super.onResumeOneShoot()
        viewModel.startCountdown()
    }

    override fun onStop() {
        super.onStop()
        viewModel.stopCountdown()
    }

    override fun initView() {
        super.initView()
        showLoadingAd()
        setPrivacyPolicy()
        requestNotificationPermission()
    }

    private fun setPrivacyPolicy() {
        val privacyPolicy = getString(R.string.privacy_policy)
        val text = "${getString(R.string.agree)} $privacyPolicy"
        val spannableString = SpannableString(text)
        val start = text.indexOf(privacyPolicy)
        val end = start + privacyPolicy.length
        val clickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(URL_PRIVACY)))
            }

            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.color = getColor(R.color.colorPrimary)
                ds.bgColor = 0
            }
        }
        spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        binding.tvAgree.text = spannableString
        binding.tvAgree.movementMethod = LinkMovementMethod.getInstance()
        binding.tvAgree.highlightColor = Color.TRANSPARENT
    }

    private fun requestNotificationPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            val array = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
            launcher.launch(array) { permissions ->
                val flag = permissions.values.all { it }
                if (flag) MyApplication.appContext.startStayJobService()
            }
        }
    }

    override fun initListener() {
        super.initListener()
        binding.tvStart.setOnClickListener {
            ifAgreePrivacy = true
            showLoadingAd()
            EventUtils.event("app_start")
            EventUtils.event("page_${javaClass.simpleName}")
            viewModel.startCountdown()
            MyApplication.appContext.initApp()
        }
    }

    private fun initUMP() {
        val ump = UmpUtils(this)

        if (ump.consentInformation.canRequestAds()) {
            AdsMgr.init(this)
        } else {
            ump.callback = {
                AdsMgr.init(this)
            }
            ump.requestUMP()
        }
    }

    private fun showLoadingAd() {
        binding.clBottomStart.visibility = if (ifAgreePrivacy) View.GONE else View.VISIBLE
        binding.clBottomLoading.visibility = if (ifAgreePrivacy) View.VISIBLE else View.GONE
        binding.llConsent.visibility = if (ifAgreePrivacy) View.GONE else View.VISIBLE

        if (ifAgreePrivacy) {
            AdsMgr.showOpen(this, showCallBack = object : AdsShowCallBack() {
                override fun show() {
                    viewModel.stopCountdown()
                }

                override fun next() {
                    binding.root.postDelayed({ jumpNext() }, 200)
                }

            })
        }
    }

    val jumped = AtomicBoolean(false)
    fun jumpNext() {
        if (jumped.get()) return
        jumped.set(true)

        if (!isGuided) {
            isGuided = true
            goToAc(GuideCleanActivity::class.java)
        } else {
            goToAc(MainActivity::class.java)
        }

        finish()

        intent.extras?.clear()
    }


}