package com.aiosman.ravenow.ui.favourite

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.cachedIn
import com.aiosman.ravenow.AppState
import com.aiosman.ravenow.data.MomentService
import com.aiosman.ravenow.entity.MomentEntity
import com.aiosman.ravenow.entity.MomentPagingSource
import com.aiosman.ravenow.entity.MomentRemoteDataSource
import com.aiosman.ravenow.entity.MomentServiceImpl
import com.aiosman.ravenow.event.MomentFavouriteChangeEvent
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode

object FavouriteListViewModel:ViewModel() {
    private val momentService: MomentService = MomentServiceImpl()
    private val _favouriteMomentsFlow =
        MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty())
    val favouriteMomentsFlow = _favouriteMomentsFlow.asStateFlow()
    var isLoading by mutableStateOf(false)
    
    init {
        EventBus.getDefault().register(this)
    }
    fun refreshPager(force:Boolean = false) {
        viewModelScope.launch {
            if (force) {
                isLoading = true
            }
            Pager(
                config = PagingConfig(pageSize = 20, enablePlaceholders = false),
                pagingSourceFactory = {
                    MomentPagingSource(
                        MomentRemoteDataSource(momentService),
                        favoriteUserId = AppState.UserId
                    )
                }
            ).flow.cachedIn(viewModelScope).collectLatest {
                _favouriteMomentsFlow.value = it
                isLoading = false
            }

        }
    }
    
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onMomentFavouriteChangeEvent(event: MomentFavouriteChangeEvent) {
        if (!event.isFavourite) {
            // 当取消收藏时，刷新列表以移除该项目
            refreshPager(force = true)
        }
    }
    
    fun ResetModel() {
        isLoading = false
        EventBus.getDefault().unregister(this)
    }
}