package com.hanwha.morakmorak.ui.main.home

import android.view.View
import androidx.lifecycle.MutableLiveData
import com.hanwha.morakmorak.core.BaseViewModel
import com.hanwha.morakmorak.data.remote.api.HomeAPI
import com.hanwha.morakmorak.data.remote.model.Home
import com.hanwha.morakmorak.data.remote.model.HomeCategory
import com.hanwha.morakmorak.extensions.with
import com.hanwha.morakmorak.util.DateUtil
import com.hanwha.morakmorak.util.NotNullMutableLiveData
import com.yalantis.phoenix.PullToRefreshView
import timber.log.Timber

/**
 * Created by aaron on 09/09/2019
 */
class HomeViewModel(private val api: HomeAPI) : BaseViewModel() {

    val isTalkSelected: MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply{ value = true}

    val isMeetingSelected: MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = true }

    val isTodaySelected: MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = false }

    val isThumbnailView: MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = false }

    val isRefresh : MutableLiveData<Boolean> = MutableLiveData()

    val refreshListener = PullToRefreshView.OnRefreshListener { isRefresh.value = true }

//    val isFavoriteSelected: MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = false }

    lateinit var goDetail: (View) -> Unit

    lateinit var updateList: () -> Unit

    lateinit var onDistanceClick: (View) -> Unit

    private val allItems: ArrayList<Home> = arrayListOf()
    private val meetingItems: ArrayList<Home> = arrayListOf()
    private val meetingTodayItems: ArrayList<Home> = arrayListOf()
    private val talkingItems: ArrayList<Home> = arrayListOf()

    private val _items: NotNullMutableLiveData<List<Home>> = NotNullMutableLiveData(arrayListOf())
    val items: NotNullMutableLiveData<List<Home>>
        get() = _items

    fun requestParties() {
        val params = mutableMapOf(
                "offset" to 1,
                "limit" to 500
        )
//        val params = mutableMapOf<String, Int>().apply {
//            this["offset"] = 1
//            this["limit"] = 30
//        }

        addToDisposable(api.parties(params).with()
                .doOnSubscribe { isProgressVisible.value = true }
                .doOnSuccess { isProgressVisible.value = false; isRefresh.value = false}
                .doOnError { isProgressVisible.value = false; isRefresh.value = false }
                .subscribe({
                    Timber.i("onResponse!!!")
                    categorizeItems(it.Parties)
                    setItem()
                }, {
                    // handle errors
                    Timber.i("onError!!!")
                    Timber.i(it)
                }))
    }

    private fun categorizeItems(items: List<Home>) {
        allItems.clear()
        meetingItems.clear()
        meetingTodayItems.clear()
        talkingItems.clear()

        allItems.addAll(items)
        for (item in items) {
            when (item.category) {
                HomeCategory.MEETING.category -> {
                    meetingItems.add(item)
                    if (DateUtil.getCalculateDDayFromToday(item.dateTime) == 0) {
                        meetingTodayItems.add(item)
                    }
                }
                HomeCategory.TALKING.category -> talkingItems.add(item)
            }
        }
    }

    private fun setItem() {
        if (isTodaySelected.value!!) _items.value = meetingTodayItems
        else if (isMeetingSelected.value!! && isTalkSelected.value!!) _items.value = allItems
        else if (isMeetingSelected.value!!) _items.value = meetingItems
        else _items.value = talkingItems
    }

//    fun getItems() : MutableList<Home> = mutableListOf<Home>().apply {
//        if (isMeetingSelected.value!!) {
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//            add(Home("내일", "12:30PM", "불금 수제맥주 & 피자 고고싱!", "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    "여의도 진주산꼼장어", 4, 6, "한화생명"))
//        }
//        if (isTalkSelected.value!!) {
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//            add(Home(time = "30분전", title = "불금 수제맥주 & 피자 고고싱!", body = "맥주를 좋아하시는 분이라면 누구나 참여가능 합니다.",
//                    location = "1km", currentUserNum = 1324, company = "한화시스템/ICT", category = TALKING.category))
//        }
//    }

    fun talkClickListener(v: View) {
        if (!isMeetingSelected.value!!) return
        isTalkSelected.value = !isTalkSelected.value!!
        setItem()
//        updateList()
    }

    fun meetingClickListener(v: View) {
        if (!isTalkSelected.value!!) return
        isMeetingSelected.value = !isMeetingSelected.value!!
        setItem()
//        updateList()
    }

    fun todayClickListener(v: View) {
        isTodaySelected.value = !isTodaySelected.value!!
        setItem()
//        updateList()
    }

    fun favoriteClickListener(item: Home) {
        Timber.i(item.id.toString())
        for (i in _items.value.indices) {
            if (item.id == _items.value[i].id) {
                if (_items.value[i].favoriteTag == "Y") {
                    _items.value[i].favoriteTag = "N"
                } else {
                    _items.value[i].favoriteTag = "Y"
                }
            }
        }
        updateList()
    }

    fun thumbClickListener(v: View) {
        isThumbnailView.value = !isThumbnailView.value!!
        updateList()
    }

//    fun favoriteClickListener(v: View) {
//        isFavoriteSelected.value = !isFavoriteSelected.value!!
//        updateList()
//    }
}