package com.example.base.viewmodel

import androidx.collection.ArrayMap
import androidx.collection.arrayMapOf
import com.example.base.livedata.SingleLiveEvent
import kotlinx.coroutines.Job
import retrofit2.http.Body


abstract class ListViewModel<T> : BaseViewModel() {

    // 全部数据(recyclerView使用的是当前list)
    val list = mutableListOf<T>()

    // 取消上次请示 防止多次请求
    private var job: Job? = null

    // 请求参数
    val params = arrayMapOf<String, String>()

    // 当前页码
    private var _pageIndex = 1
    val pageIndex get() = _pageIndex

    // 每页条数
    val pageCount = 20


    // 每页的数据
    val pageLiveData = SingleLiveEvent<Result<List<T>>>()


    /**
     * 获取第一页数据
     */
    fun refresh() {
        _pageIndex = 1
        request()
    }

    /**
     * 获取下一页数据
     */
    fun loadMore() {
        request()
    }

    /**
     * @param
     * 请求数据
     */
    private fun request() {

        params["page"] = "$pageIndex"
        params["size"] = "$pageCount"

        job?.cancel()   // 取消上次请求
        job = launchOnUiTryCatch({

            val result = requestApi(params)
            if (result.isSuccess) {
                _pageIndex++
            }

            pageLiveData.value = result

        }, { error ->
            pageLiveData.value = Result.failure(error)
        })

    }

    /**
     * 请求接口返回数据
     */
    abstract suspend fun requestApi(@Body params: ArrayMap<String, String>): Result<List<T>>
}
