package com.base.filerecoveryrecyclebin.ads.max

import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.os.CountDownTimer
import android.os.Handler
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdDisplayUtils
import com.base.filerecoveryrecyclebin.ads.AdmobCommonUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobEvent
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.utils.EventUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.CustomDialog
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.FullScreenContentCallback
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.json.JSONObject
import java.util.concurrent.TimeUnit
import kotlin.math.min
import kotlin.math.pow

object AdMaxInterstitialUtils {

    private val TAG = "AdMaxInterstitialUtils"
    private var interstitialAd: MaxInterstitialAd? = null
    private var interLoadTime = Long.MAX_VALUE
    private var onHidden: (() -> Unit)? = null
    private var loadingListener: (() -> Unit)? = null
    private var retryAttempt = 0

    @SuppressLint("StaticFieldLeak")
    private var customDialog: CustomDialog? = null

    private fun setListener(activity: Activity) {
        if (interstitialAd == null) {
            interstitialAd = MaxInterstitialAd(ConfigHelper.interAdMaxId, activity)
        }

        interstitialAd?.setListener(object : MaxAdListener {
            override fun onAdLoaded(p0: MaxAd) {
                loadingListener?.invoke()
                interLoadTime = System.currentTimeMillis()
                retryAttempt = 0
            }

            override fun onAdDisplayed(p0: MaxAd) {
            }

            override fun onAdHidden(p0: MaxAd) {
                onHidden?.invoke()
            }

            override fun onAdClicked(p0: MaxAd) {
            }

            override fun onAdLoadFailed(p0: String, p1: MaxError) {
                retryAttempt++
                val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong())

                MainScope().launch {
                    delay(delayMillis)
                    interstitialAd?.loadAd()
                }
            }

            override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
            }
        })
    }

    fun showInterstitialAd(
        activity: Activity,
        isReLoadAd: Boolean = false,
        isShowDialog: Boolean = true,
        onHidden: (() -> Unit)? = null
    ) {
        setListener(activity)

        if (activity.isFinishing || activity.isDestroyed) {
            return
        }
        val obj1 = JSONObject()
        obj1.put("ad_unit", "interAd")
        EventUtils.event("ad_prepare_show", ext = obj1)

        if (isAdExpired()) {
            val obj2 = JSONObject()
            obj2.put("ad_unit", "interAd")
            EventUtils.event("ad_expire", ext = obj2)
            interstitialAd?.loadAd()
            onHidden?.invoke()
            return
        }


        if (!AdDisplayUtils.getInstance().shouldShowAd()) {
            onHidden?.invoke()
            return
        }

        this.onHidden = onHidden
        if (interstitialAd?.isReady == true) {
            LogEx.logDebug(TAG, "isReady=true")
            showIntervalDialogAndShowAd(activity, isShowDialog, onHidden, 2)
        } else {
            interstitialAd?.loadAd()
            LogEx.logDebug(TAG, "isReady=false")
            showAdDialogAndLoadInterstitial(activity, isReLoadAd, isShowDialog, onHidden)
        }

    }

    private fun isAdExpired(): Boolean {
        return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
    }

    private fun showIntervalDialogAndShowAd(
        activity: Activity,
        isShowDialog: Boolean,
        onHidden: (() -> Unit)?,
        interval: Int
    ) {
        if (!isShowDialog) {
            return
        }

        if (customDialog != null && customDialog?.isShowing == true) {
            return  // 如果对话框已经显示，则不再显示
        }

        customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
        customDialog?.setCountdownText(R.id.dialog_ad_loading_text)
        val countdownTimer = object : CountDownTimer((interval * 1000).toLong(), 1000) {
            override fun onTick(millisUntilFinished: Long) {
                val seconds = (millisUntilFinished / 1000).toInt()
                customDialog?.updateCountdownText("Advertising in preparation ($seconds" + "s)...")
            }

            override fun onFinish() {
                if (!activity.isDestroyed && !activity.isFinishing) {
                    customDialog?.dismiss()
                }
                customDialog = null
                LogEx.logDebug(TAG, "onFinish")
                interstitialAd?.showAd()
            }
        }
        countdownTimer.start()
        customDialog?.show()
    }

    private fun showAdDialogAndLoadInterstitial(
        activity: Activity,
        isReLoadAd: Boolean,
        isShowDialog: Boolean,
        onHidden: (() -> Unit)?
    ) {
        if (!isShowDialog) {
            return
        }
        var mDialog: Dialog? = null
        if (!activity.isFinishing && !activity.isDestroyed) {
            mDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
            // 设置对话框的样式和内容
            mDialog.show()
        }

        loadingListener = {
            mDialog?.dismiss()
            interstitialAd?.showAd()
            loadingListener = null
        }

//        if (isReLoadAd) {
//            mDialog?.dismiss()
//            onHidden?.invoke()
//        }
    }


}