package com.gh.gamecenter.common.base.fragment

/**
 * 懒加载（支持多层嵌套）
 */
abstract class BaseLazyFragment : ToolbarFragment() {

    private var isFirstVisible = true

    private var isViewCreated = false

    protected var isSupportVisible = false

    // 可见不可见回调
    private var resumeAndPauseListener: ((isResume: Boolean) -> Unit)? = null

    /**
     * 用于分发可见时间的时候获取 父fragment 是否隐藏
     *
     * @return true fragment 不可见， false 父 fragment 可见
     */
    private val isParentInvisible: Boolean
        get() {
            val parentFragment = parentFragment
            return if (parentFragment is BaseLazyFragment) {
                val fragment = parentFragment as BaseLazyFragment?
                !fragment!!.isSupportVisible
            } else {
                false
            }
        }

    /**
     * 设置页面可见不可见回调
     */
    fun setResumeAndPauseListener(listener: ((isResume: Boolean) -> Unit)?) {
        resumeAndPauseListener = listener
    }

    /**
     * 页面当前是否可见
     */
    fun isCurrentlyVisible() = isSupportVisible

    override fun onHiddenChanged(hidden: Boolean) {
        super.onHiddenChanged(hidden)

        if (hidden) {
            dispatchUserVisibleHint(false)
        } else {
            dispatchUserVisibleHint(true)
        }
    }

    override fun onResume() {
        super.onResume()
        if (!isHidden && !isSupportVisible) {
            dispatchUserVisibleHint(true)
        }
    }

    override fun onPause() {
        super.onPause()
        // 当前 Fragment 包含子 Fragment 的时候 dispatchUserVisibleHint 内部本身就会通知子 Fragment 不可见
        // 子 fragment 走到这里的时候自身又会调用一遍 ？
        if (isSupportVisible) {
            dispatchUserVisibleHint(false)
        }
    }


    /**
     * 统一处理 显示隐藏
     *
     * @param visible
     */
    private fun dispatchUserVisibleHint(visible: Boolean) {
        if (visible && isParentInvisible) return

        //此处是对子 Fragment 不可见的限制，因为 子 Fragment 先于父 Fragment回调本方法 currentVisibleState 置位 false
        // 当父 dispatchChildVisibleState 的时候第二次回调本方法 visible = false 所以此处 visible 将直接返回
        if (isSupportVisible == visible) {
            return
        }

        isSupportVisible = visible

        if (visible) {

            if (view == null) return

            if (isFirstVisible) {
                isFirstVisible = false
                onFragmentFirstVisible()
            }
            onFragmentResume()
            resumeAndPauseListener?.invoke(true)
        } else {
            if (!isFirstVisible) {
                onFragmentPause()
                resumeAndPauseListener?.invoke(false)
            }
        }
    }

    open fun onFragmentFirstVisible() {
        //ULog.e("对用户第一次可见")
    }

    open fun onFragmentResume() {
        //ULog.e("对用户可见")
    }

    open fun onFragmentPause() {
        //ULog.e("对用户不可见")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        isViewCreated = false
        isFirstVisible = true
    }

}
