package com.base.locationsharewhite.ads

import android.app.Activity
import android.app.Dialog
import android.content.Context
import java.lang.ref.WeakReference


class adState<T>() {

    var adDialog: Dialog? = null


    /**
     * 当前缓存的广告
     */
    var currentAd: T? = null

    /**
     * 是否正在缓存加载广告
     */
    var loadingAd: Boolean = false


    /**
     * 是否正在显示广告
     */
    var showingAd: Boolean = false

    /**
     * 用于保存引用现有页面，在此页面显示广告(因为要等待广告加载完毕)
     */
    var activityRef: WeakReference<Activity>? = null

    /**
     * 上一次的缓存成功时间
     */
    var lastLoadTime: Long = 0

    /**
     * 上次展示时间
     */
    var lastShowTime: Long = 0

    fun onAdDisplayed() {
        showingAd = true

        adDialog?.dismiss()
        adDialog = null

        lastShowTime = System.currentTimeMillis()

        currentAd = null
        activityRef = null
    }

    fun onAdHidden() {
        // 广告关闭，清空缓存数据，重新加载
        showingAd = false
    }

    fun onAdDisplayFailed() {
        adDialog?.dismiss()
        adDialog = null

        showingAd = false
        currentAd = null
        activityRef = null
    }

    fun onAdLoaded(ad: T?) {
        //这里可能提前设置,所有可以不设置,max回调的类型可能不同
        if (ad != null) {
            currentAd = ad
        }
        loadingAd = false
        lastLoadTime = System.currentTimeMillis()
    }

    fun onAdLoadFailed() {
        adDialog?.dismiss()
        adDialog = null
        loadingAd = false

    }

}

/**
 * 特定广告管理基类
 * @param T  缓存广告的类
 */
abstract class BaseAdMgr<T> {

    /**
     * 广告展示回调
     */
    protected var showCallBack: AdsShowCallBack? = null

    /**
     * 当前缓存的广告
     */
    protected var currentAd: T? = null

    /**
     * 是否正在缓存加载广告
     */
    protected var loadingAd: Boolean = false

    /**
     * 是否正在显示广告
     */
    protected var showingAd: Boolean = false

    /**
     * 用于保存引用现有页面，在此页面显示广告(因为要等待广告加载完毕)
     */
    protected var activityRef: WeakReference<Activity>? = null

    /**
     * 上一次的缓存成功时间
     */
    protected var lastLoadTime: Long = 0


    /**
     * 预加载广告
     *
     * @param context 加载所用的上下文，一般使用appContext
     */
    abstract fun loadAd(context: Context, isUnLimit: Boolean = true, adEvent: AdEvent)

    /**
     * 广告显示
     *
     * @param activity 当前页面
     */
    abstract fun show(activity: Activity, isUnLimit: Boolean = true, adEvent: AdEvent, showCallBack: AdsShowCallBack? = null)


    /**
     * 预加载的缓存超时判断
     *
     * @return  true：没有超时    false：超时需要重新加载
     */
    abstract fun adAvailable(): Boolean
}