package com.aiosman.riderpro

import androidx.paging.PagingSource
import androidx.paging.PagingState
import kotlin.math.ceil
import kotlinx.coroutines.delay

internal class TestChatBackend(
    private val backendDataList: List<ChatNotificationData>,
    private val loadDelay: Long = 500,
) {
    val DataBatchSize = 1
    class DesiredLoadResultPageResponse(val data: List<ChatNotificationData>)
    /** Returns [DataBatchSize] items for a key */
    fun searchItemsByKey(key: Int): DesiredLoadResultPageResponse {
        val maxKey = ceil(backendDataList.size.toFloat() / DataBatchSize).toInt()
        if (key >= maxKey) {
            return DesiredLoadResultPageResponse(emptyList())
        }
        val from = key * DataBatchSize
        val to = minOf((key + 1) * DataBatchSize, backendDataList.size)
        val currentSublist = backendDataList.subList(from, to)
        return DesiredLoadResultPageResponse(currentSublist)
    }
    fun getAllData() = TestChatPagingSource(this, loadDelay)
}
internal class TestChatPagingSource(
    private val backend: TestChatBackend,
    private val loadDelay: Long,
) : PagingSource<Int, ChatNotificationData>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ChatNotificationData> {
        // Simulate latency
        delay(loadDelay)
        val pageNumber = params.key ?: 0
        val response = backend.searchItemsByKey(pageNumber)
        // Since 0 is the lowest page number, return null to signify no more pages should
        // be loaded before it.
        val prevKey = if (pageNumber > 0) pageNumber - 1 else null
        // This API defines that it's out of data when a page returns empty. When out of
        // data, we return `null` to signify no more pages should be loaded
        val nextKey = if (response.data.isNotEmpty()) pageNumber + 1 else null
        return LoadResult.Page(data = response.data, prevKey = prevKey, nextKey = nextKey)
    }
    override fun getRefreshKey(state: PagingState<Int, ChatNotificationData>): Int? {
        return state.anchorPosition?.let {
            state.closestPageToPosition(it)?.prevKey?.plus(1)
                ?: state.closestPageToPosition(it)?.nextKey?.minus(1)
        }
    }
}