package com.base.datarecovery.ads

import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.os.CountDownTimer
import android.widget.Toast
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.pullAd
import com.base.datarecovery.ads.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.view.CustomDialog
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 java.util.UUID

object AdmobInterstitialUtils {

    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: CustomDialog? = null

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

    fun showInterstitialAd(
        activity: Activity,
        isLoadAdNow: Boolean = false,
        isShowInterVal: Boolean = true,
        onHidden: (() -> Unit)? = null
    ) {
        if (activity.isFinishing || activity.isDestroyed) {
            return
        }
        val obj = JSONObject()
        obj.put("ad_unit", "interAd")
//        EventUtils.event("ad_prepare_show", ext = obj)

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

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

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

    fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
        if (interAd != null) {
            onLoad?.invoke()
            return
        }
        if (!AdDisplayUtils.getInstance().shouldShowAd()) {
            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)
//        EventUtils.event("ad_pull_start", ext = obj)
        InterstitialAd.load(
            activity,
            ConfigHelper.interAdmobId,
            mRequest,
            object : InterstitialAdLoadCallback() {
                override fun onAdFailedToLoad(p0: LoadAdError) {
                    interAd = null
                    onLoad?.invoke()
                    pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
                    if (BuildConfig.DEBUG) {
                        Toast.makeText(
                            BaseApplication.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 = AdmobEvent.EventOnPaidEventListener(ad)
                }
            })
    }

    private fun showIntervalDialogAndShowAd(
        activity: Activity,
        isLoadAdNow: Boolean,
        isShowInterVal: Boolean,
        onHidden: (() -> Unit)?,
        interval: Int
    ) {
        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() {
                displayInterstitialAd(activity, onHidden)
                if (!activity.isDestroyed && !activity.isFinishing) {
                    customDialog?.dismiss()
                }
                customDialog = null
            }
        }
        countdownTimer.start()
        customDialog?.show()
    }

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


        loadInterstitialAd(activity) {
            mDialog?.dismiss()
            if (!isLoadAdNow) {
                showInterstitialAd(activity, true, isShowInterVal) {
                    onHidden?.invoke()
                }
            }
        }
        if (isLoadAdNow) {
            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")
                AdDisplayUtils.getInstance().incrementAdClickCount()
                isMultiClick(thisInterAd)
            }

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

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

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