package com.zswc.creativity.vmodel

import android.app.Activity
import android.app.Application
import android.text.TextUtils
import androidx.databinding.Bindable
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.zswc.creativity.BR
import com.zswc.creativity.R
import com.zswc.creativity.config.ConfigMMKV
import com.zswc.creativity.utils.net.NetEngine
import com.ysnows.base.base.BRepository
import com.ysnows.base.base.BViewModel
import com.ysnows.base.utils.MMKVManager
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.launch
import java.util.concurrent.TimeUnit

class ForgetPasswordVModel(application: Application) : BViewModel<BRepository>(application) {

    var codeTip: MutableLiveData<String> = MutableLiveData(getCodeStr)
    private var disposable: Disposable? = null


    companion object {
        const val time = 60
        var timeStart: Long = 1
        const val getCodeStr = "获取验证码"

    }

    @Bindable
    var phone: String? = null
        set(value) {
            field = value
            notifyPropertyChanged(BR.phone)
        }

    @Bindable
    var code: String? = null
        set(value) {
            field = value
            notifyPropertyChanged(BR.code)
        }

    @Bindable
    var passWord: String? = null
        set(value) {
            field = value
            notifyPropertyChanged(BR.passWord)
        }

    @Bindable
    var passWordTo: String? = null
        set(value) {
            field = value
            notifyPropertyChanged(BR.passWordTo)
        }


    fun toSubmit() {
        if (TextUtils.isEmpty(phone)) {
            toast("请输入手机号")
            return
        }

        if (TextUtils.isEmpty(code)) {
            toast("请输入验证码")
            return
        }
        if (TextUtils.isEmpty(passWord)) {
            toast("请输入新密码")
            return
        }

        if (TextUtils.isEmpty(passWordTo)) {
            toast("请再次输入新密码")
            return
        }

        if (!passWord.equals(passWordTo)) {
            toast("两次密码不一致")
            return
        }

        viewModelScope.launch {

            val it = repository().lreq { NetEngine.service.setPassword(phone, code,passWord,passWordTo) }
            if (it.ok(true)) {
                var con = repository().context as Activity
                con.finish()
            }
        }

    }


    fun getSmsCode(start: Long = 1) {
        if (codeTip.value != getCodeStr) {
            return
        }

        if (phone.isNullOrEmpty()) {
            toast(R.string.please_input_user_phone)
            return
        }

        viewModelScope.launch {

            val it = repository().lreq { NetEngine.service.getPassword("forgetpwd",phone) }
            if (it.ok(true)) {
                startTimer(start)
            }

        }

    }

    private fun startTimer(start: Long = 1) {
        disposeTimer()
        disposable = Observable.intervalRange(start, time - start + 1, 0, 1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext {
                    timeStart = it
                    codeTip.value = if (time - it > 0) "${time - it}秒后重发" else {
                        getCodeStr
                    }
                }
                .doOnComplete() {
                    MMKVManager.instance().encode(ConfigMMKV.REGISTER_TIME_START, 60)
                }
                .doOnDispose() {
                    MMKVManager.instance().encode(ConfigMMKV.REGISTER_TIME_START, 60)
                }
                .subscribe()
    }

    private fun disposeTimer() {
        disposable?.isDisposed ?: disposable?.dispose()
    }

    override fun onCleared() {
        super.onCleared()
        disposeTimer()
    }


}



