package com.lukouguoji.module_base.model

import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.fastjson.JSONObject
import com.lukouguoji.module_base.bean.BaseListBean
import com.lukouguoji.module_base.interfaces.IGetData
import com.lukouguoji.module_base.ktx.loadMore
import com.lukouguoji.module_base.ktx.loge
import com.lukouguoji.module_base.ktx.refresh
import com.scwang.smart.refresh.layout.SmartRefreshLayout

/**
 * @author：孟凡华
 * @date：2022/12/1
 * @desc：分页用工具
 */
class PageModel {

    // 页码
    var page: Int = 1

    // 每页数量
    var limit: Int = 20

    /**
     * 是否有更多数据
     * 用于决定刷新布局能否加载更多
     */
    val haveMore = MutableLiveData(false)

    /**
     * 是否处于加载中
     * 一般情况下,监听改变就关闭加载状态
     */
    val loadRefreshing = MutableLiveData(false)

    // 列表布局
    var rv: RecyclerView? = null

    // 请求参数
    val map: MutableMap<String, Any?> = mutableMapOf()

    /**
     * 刷新
     */
    fun refresh() {
        page = 1
        haveMore.postValue(false)
    }

    /**
     * 加载更多
     */
    fun loadMore() {
        page += 1
    }

    /**
     * 生成请求参数
     */
    fun generateParams(): JSONObject {
        val jsonObject = JSONObject()
        jsonObject["page"] = page
        jsonObject["limit"] = limit
        map.forEach {
            jsonObject[it.key] = it.value
        }
        return jsonObject
    }

    /**
     * 当前是否为刷新模式
     */
    fun isRefresh() = page == 1

    /**
     * 绑定刷新布局逻辑
     */
    fun bindSmartRefreshLayout(
        //刷新布局
        srl: SmartRefreshLayout,
        //列表布局
        rv: RecyclerView,
        //获取数据对象
        getData: IGetData,
        //生命周期持有者
        lifecycleOwner: LifecycleOwner
    ) {
        this.rv = rv
        srl.post {
            // 监听刷新事件
            srl.setOnRefreshListener {
                refresh()
                getData.getData()
            }
            // 监听加载更多
            srl.setOnLoadMoreListener {
                loadMore()
                getData.getData()
            }

            lifecycleOwner.let {
                //观察是否刷新完成
                loadRefreshing.observe(lifecycleOwner) {
                    srl.finishLoadMore()
                    srl.finishRefresh()
                }

                //观察是否可以加载更多数据
                haveMore.observe(lifecycleOwner) {
                    srl.setEnableLoadMore(it)
                }
            }
        }
    }

    /**
     * 处理列表数据。
     * onDataApplied 在 adapter.items 真正更新后回调（refresh/loadMore 都用 post 异步派发到 adapter，
     * 这里再嵌套一层 post 确保排在内部 post 之后）。
     */
    fun handleDataList(list: List<Any>?, onDataApplied: (() -> Unit)? = null) {
        rv?.let {
            it.post {
                if (isRefresh()) {
                    it.refresh(list)
                } else {
                    it.loadMore(list)
                }
                if (onDataApplied != null) {
                    it.post { onDataApplied() }
                }
            }
        }
        // 关闭加载状态
        loadRefreshing.postValue(false)
    }

    /**
     * 处理listBean数据
     */
    fun handleListBean(listBean: BaseListBean<*>?, onDataApplied: (() -> Unit)? = null) {
        loge("rv:${rv}")
        handleDataList(listBean?.list, onDataApplied)
        haveMore.postValue((listBean?.pages ?: 1) > page)
    }

    fun finishLoading() {
        loadRefreshing.postValue(false)
    }

}

