package rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.bounceedto.auditoredto

import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.widget.Toast
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import org.json.JSONObject
import rowedto.jockeyedto.sheetedto.balsamedto.formaledto.orientationedto.Standardedto
import rowedto.jockeyedto.sheetedto.knewedto.economicedto.copyrightedto.Celledto
import rowedto.jockeyedto.sheetedto.knewedto.economicedto.copyrightedto.Driededto
import rowedto.jockeyedto.sheetedto.raceedto.pavementedto.Slantedto
import rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.Modestedto
import rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.Scandaledto.lastShowedOnHiddenTime
import rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.bounceedto.auditoredto.Beeedto.clickAd
import rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.bounceedto.auditoredto.Beeedto.pullAd
import rowedto.jockeyedto.sheetedto.strangeedto.pyramidedto.particlesedto.bounceedto.auditoredto.Beeedto.showAd
import java.util.UUID

object Fatedto {

    private var interAd: InterstitialAd? = null
    private var interLoadTime = Long.MAX_VALUE
    private var adLastDisplayTime: Long = 0
    private val mRequest = AdRequest.Builder().build()

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

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

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

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

        if (isAdExpired()) {
            val obj = JSONObject()
            obj.put("ad_unit", "interAd")
            Slantedto.event("ad_expire", ext = obj)
            interAd = null
            loadInterstitialAd(activity)
            onHidden?.invoke()
            return
        }

        if (!Modestedto.getInstance().shouldShowAd("interAd")) {
            onHidden?.invoke()
            return
        }

        if (interAd != null) {
            showIntervalDialogAndShowAd(activity, isShowDialog, onHidden, 2)
        } else {
            showAdDialogAndLoadInterstitial(activity, isReLoadAd, isShowDialog, onHidden)
        }
    }

    fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
        if (interAd != null) {
            onLoad?.invoke()
            return
        }
        if (!Modestedto.getInstance().shouldShowAd("interAd")) {
            onLoad?.invoke()
            return
        }
        val reqId = UUID.randomUUID().toString()
        val obj = JSONObject()
        obj.put("req_id", reqId)
        obj.put("ad_type", "interAd")
        obj.put("from", activity.javaClass.simpleName)
        Slantedto.event("ad_pull_start", ext = obj)
        InterstitialAd.load(
            activity,
            if (BuildConfig.DEBUG) Celledto.interAdmobIdTest else Celledto.interAdmobId,
            mRequest,
            object : InterstitialAdLoadCallback() {
                override fun onAdFailedToLoad(p0: LoadAdError) {
                    Modestedto.getInstance().incrementAdRequestFailCount()
                    interAd = null
                    onLoad?.invoke()
                    pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
                    if (BuildConfig.DEBUG) {
                        Toast.makeText(
                            Driededto.context,
                            "拉取失败" + p0.message,
                            Toast.LENGTH_SHORT
                        ).show()
                    }

                }

                override fun onAdLoaded(ad: InterstitialAd) {
                    interAd = ad
                    onLoad?.invoke()
                    interLoadTime = System.currentTimeMillis()
                    pullAd(ad.responseInfo, "interAd", reqId = reqId)
                    ad.onPaidEventListener = Beeedto.EventOnPaidEventListener(ad)
                }
            })
    }

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

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


        loadInterstitialAd(activity) {
            mDialog?.dismiss()
            if (!isReLoadAd) {
                showInterstitialAd(activity, true, false) {
                    onHidden?.invoke()
                }
            }
        }
        if (isReLoadAd) {
            mDialog?.dismiss()
            onHidden?.invoke()
        }
    }

    private fun displayInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
        val thisInterAd = interAd
        interAd = null
        thisInterAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
            override fun onAdClicked() {
                clickAd(thisInterAd?.responseInfo, "interAd")
                Modestedto.getInstance().incrementAdClickCount()
            }

            override fun onAdDismissedFullScreenContent() {
                interAd = null
                onHidden?.invoke()
                loadInterstitialAd(activity)
                lastShowedOnHiddenTime = System.currentTimeMillis()
            }

            override fun onAdFailedToShowFullScreenContent(p0: AdError) {
                interAd = null
                onHidden?.invoke()
                loadInterstitialAd(activity)
            }

            override fun onAdShowedFullScreenContent() {
                showAd(thisInterAd?.responseInfo, "interAd", activity)
                Modestedto.getInstance().incrementAdDisplayCount()
                adLastDisplayTime = System.currentTimeMillis() / 1000
            }
        }
        thisInterAd?.show(activity)
    }
}