package com.base.datarecovery.ads.max

import android.app.Activity
import android.content.Context
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import com.base.datarecovery.ads.AdDisplayUtils
import com.base.datarecovery.ads.admob.AdmobCommonUtils
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.EventUtils
import com.base.datarecovery.utils.LogEx
import org.json.JSONObject

object AdMaxOpenUtils {
    private val TAG = "AdMaxOpenUtils"
    private var appOpenAd: MaxAppOpenAd? = null
    private var openLoadTime = Long.MAX_VALUE
    private var onHidden: (() -> Unit)? = null
    private var loadingListener: (() -> Unit)? = null
    private var retryAttempt = 0
    private var maxRetryAttempt = 8

    private fun setListener(context: Context) {
        if (appOpenAd == null) {
            appOpenAd = MaxAppOpenAd(ConfigHelper.openAdMaxId, context)

            appOpenAd?.setListener(object : MaxAdListener {
                override fun onAdLoaded(p0: MaxAd) {
                    LogEx.logDebug(TAG, "onAdLoaded")
                    openLoadTime = System.currentTimeMillis()
                    loadingListener?.invoke()
                }

                override fun onAdLoadFailed(p0: String, p1: MaxError) {
                    LogEx.logDebug(TAG, "onAdLoadFailed")
                    onHidden?.invoke()
                    AdDisplayUtils.getInstance().incrementAdRequestFailCount()
//                    retryAttempt++
//                    val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(min(6, retryAttempt)).toLong())
//                    LogEx.logDebug(TAG, "onAdLoadFailed retryAttempt=$retryAttempt delayMillis=$delayMillis")
//                    if (retryAttempt == 2) {
//                        LogEx.logDebug(TAG, "onAdLoadFailed onHidden")
//                        onHidden?.invoke()
//                    }
//
//                    if (retryAttempt <= maxRetryAttempt) {
//                        MainScope().launch {
//                            delay(delayMillis)
//                            appOpenAd?.loadAd()
//                        }
//                    } else {
//                        retryAttempt = 0
//                    }
                }


                override fun onAdDisplayed(p0: MaxAd) {
                    AdDisplayUtils.getInstance().incrementAdDisplayCount()
                }

                override fun onAdHidden(p0: MaxAd) {
                    onHidden?.invoke()
                    appOpenAd?.loadAd()
                    loadingListener = null
                }

                override fun onAdClicked(p0: MaxAd) {
                    AdDisplayUtils.getInstance().incrementAdClickCount()
//                    com.base.datarecovery.ads.max.AdMaxEvent.clickAd(appOpenAd, "openAd")
                    AdmobCommonUtils.isMultiClick(appOpenAd)
                }


                override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
                    LogEx.logDebug(TAG, "onAdDisplayFailed")
                    onHidden?.invoke()
                    appOpenAd?.loadAd()
                    val obj = JSONObject()
                    obj.put("reason", p1.message)
                    obj.put("ad_unit", "openAd")
                    EventUtils.event("ad_show_error", ext = obj)
                }
            })

            appOpenAd?.setRevenueListener { ad ->

            }
        }
    }

    fun showAppOpenAd(activity: Activity, loaded: (() -> Unit)? = null, onHidden: (() -> Unit)? = null) {

        setListener(activity)

        if (activity.isFinishing || activity.isDestroyed) {
            return
        }

        if (!AdDisplayUtils.getInstance().shouldShowAd()) {
            LogEx.logDebug(TAG, "!shouldShowAd")
            onHidden?.invoke()
            return
        }

        if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
            LogEx.logDebug(TAG, "openLoadTime > ")
            onHidden?.invoke()
            val obj2 = JSONObject()
            obj2.put("ad_unit", "openAd")
            EventUtils.event("ad_expire", ext = obj2)
            appOpenAd?.loadAd()
        }

        if (!AdMaxInit.isAdMaxInit.get()) {
            onHidden?.invoke()
            return
        }


        LogEx.logDebug(TAG, "showAppOpenAd continue")

        AdMaxOpenUtils.onHidden = onHidden

        if (appOpenAd?.isReady == true) {
            LogEx.logDebug(TAG, "isReady=false")
            appOpenAd?.showAd()
        } else {
            appOpenAd?.loadAd()
            loadingListener = {
                LogEx.logDebug(TAG, "loadingListener callback")
                loaded?.invoke()
                val obj1 = JSONObject()
                obj1.put("ad_unit", "openAd")
                EventUtils.event("ad_prepare_show", ext = obj1)
                appOpenAd?.showAd()
                loadingListener = null
            }
        }
    }

    fun loadAppOpenAd(activity: Activity) {
        setListener(activity)
        LogEx.logDebug(TAG, "loadAppOpenAd1")
        if (AdMaxInit.isAdMaxInit.get()) {
            LogEx.logDebug(TAG, "loadAppOpenAd2")
            appOpenAd?.loadAd()
        } else {
            LogEx.logDebug(TAG, "loadAppOpenAd3")
        }
    }

}

