package com.aiosman.ravenow.entity

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.aiosman.ravenow.data.CommentRemoteDataSource
import com.aiosman.ravenow.data.NoticePost
import java.util.Date

data class CommentEntity(
    val id: Int,
    val name: String,
    val comment: String,
    val date: Date,
    val likes: Int,
    val postId: Int = 0,
    val avatar: String,
    val author: Long,
    var liked: Boolean,
    var unread: Boolean = false,
    var post: NoticePost?,
    var reply: List<CommentEntity>,
    var replyUserId: Long?,
    var replyUserNickname: String?,
    var replyUserAvatar: String?,
    var parentCommentId: Int?,
    var replyCount: Int,
    var replyPage: Int = 1
)

class CommentPagingSource(
    private val remoteDataSource: CommentRemoteDataSource,
    private val postId: Int? = null,
    private val postUser: Int? = null,
    private val selfNotice: Boolean? = null,
    private val order: String? = null,
    private val parentCommentId: Int? = null
) : PagingSource<Int, CommentEntity>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, CommentEntity> {
        return try {
            val currentPage = params.key ?: 1
            val comments = remoteDataSource.getComments(
                pageNumber = currentPage,
                postId = postId,
                postUser = postUser,
                selfNotice = selfNotice,
                order = order,
                parentCommentId = parentCommentId,
                pageSize = params.loadSize
            )
            LoadResult.Page(
                data = comments.list,
                prevKey = if (currentPage == 1) null else currentPage - 1,
                nextKey = if (comments.list.isEmpty()) null else comments.page + 1
            )
        } catch (exception: Exception) {
            return LoadResult.Error(exception)
        }
    }

    override fun getRefreshKey(state: PagingState<Int, CommentEntity>): Int? {
        return state.anchorPosition
    }

}