package kr.co.vividnext.sodalive.audio_content.series.content

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.audio_content.series.SeriesListAllViewModel
import kr.co.vividnext.sodalive.audio_content.series.SeriesRepository
import kr.co.vividnext.sodalive.audio_content.series.detail.GetSeriesContentListItem
import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager

class SeriesContentAllViewModel(private val repository: SeriesRepository) : BaseViewModel() {
    private val _toastLiveData = MutableLiveData<String?>()
    val toastLiveData: LiveData<String?>
        get() = _toastLiveData

    private var _isLoading = MutableLiveData(false)
    val isLoading: LiveData<Boolean>
        get() = _isLoading

    private var _seriesContentListLiveData = MutableLiveData<List<GetSeriesContentListItem>>()
    val seriesContentListLiveData: LiveData<List<GetSeriesContentListItem>>
        get() = _seriesContentListLiveData

    private var _sortLiveData = MutableLiveData(SeriesListAllViewModel.SeriesSortType.NEWEST)
    val sortLiveData: LiveData<SeriesListAllViewModel.SeriesSortType>
        get() = _sortLiveData

    var seriesId = 0L

    var page = 1
    private var pageSize = 10
    private var isLast = false

    fun getSeriesContentList() {
        if (!_isLoading.value!! && !isLast) {
            _isLoading.value = true

            compositeDisposable.add(
                repository.getSeriesContentList(
                    seriesId = seriesId,
                    page = page,
                    size = pageSize,
                    sortType = _sortLiveData.value!!,
                    token = "Bearer ${SharedPreferenceManager.token}"
                )
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                        {
                            if (it.success && it.data != null) {
                                page += 1

                                if (it.data.items.isNotEmpty()) {
                                    _seriesContentListLiveData.value = it.data.items
                                } else {
                                    isLast = true
                                }
                            } else {
                                if (it.message != null) {
                                    _toastLiveData.value = it.message
                                } else {
                                    _toastLiveData.value = "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
                                }
                            }
                            _isLoading.value = false
                        },
                        {
                            _isLoading.value = false
                            it.message?.let { message -> Logger.e(message) }
                            _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
                        }
                    )
            )
        }
    }

    fun changeSort(sortType: SeriesListAllViewModel.SeriesSortType) {
        if (_sortLiveData.value != sortType) {
            page = 1
            isLast = false
            _sortLiveData.value = sortType
        }
    }
}
