package kr.co.vividnext.sodalive.mypage.block

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.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.user.UserRepository

class BlockMemberViewModel(private val userRepository: UserRepository) : BaseViewModel() {
    private val _blockedMemberListLiveData = MutableLiveData<List<GetBlockedMemberListItem>>()
    val blockedMemberListLiveData: LiveData<List<GetBlockedMemberListItem>>
        get() = _blockedMemberListLiveData

    private val _blockedMemberTotalCountLiveData = MutableLiveData(0)
    val blockedMemberTotalCountLiveData: LiveData<Int>
        get() = _blockedMemberTotalCountLiveData

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

    private val _toastLiveData = MutableLiveData<String?>()
    val toastLiveData: LiveData<String?>
        get() = _toastLiveData

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

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

            compositeDisposable.add(
                userRepository.getBlockedMemberList(
                    page = page,
                    size = pageSize,
                    token = "Bearer ${SharedPreferenceManager.token}"
                )
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                        {
                            _isLoading.value = false
                            if (it.success && it.data != null) {
                                val data = it.data
                                if (data.items.isEmpty()) {
                                    isLast = true
                                } else {
                                    page += 1
                                    _blockedMemberTotalCountLiveData.value = data.totalCount
                                    _blockedMemberListLiveData.value = data.items
                                }
                            } else {
                                if (it.message != null) {
                                    _toastLiveData.postValue(it.message)
                                } else {
                                    _toastLiveData.postValue(
                                        "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
                                    )
                                }
                            }
                        },
                        {
                            _isLoading.value = false
                            it.message?.let { message -> Logger.e(message) }
                            _toastLiveData.postValue(
                                "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
                            )
                        }
                    )
            )
        }
    }

    fun blockMember(blockMemberId: Long) {
        _blockedMemberTotalCountLiveData.value = _blockedMemberTotalCountLiveData.value!! + 1
        compositeDisposable.add(
            userRepository.memberBlock(
                blockMemberId,
                "Bearer ${SharedPreferenceManager.token}"
            )
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({}, {})
        )
    }

    fun unBlockMember(blockMemberId: Long) {
        _blockedMemberTotalCountLiveData.value = _blockedMemberTotalCountLiveData.value!! - 1
        compositeDisposable.add(
            userRepository.memberUnBlock(
                blockMemberId,
                "Bearer ${SharedPreferenceManager.token}"
            )
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({}, {})
        )
    }
}
