package com.yidianling.consultant

import android.annotation.SuppressLint
import android.text.TextUtils
import com.google.gson.Gson
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.mvp.base.SimplePresenter
import com.ydl.ydlcommon.utils.RxLifecycleUtils
import com.ydl.ydlcommon.utils.YDLAsyncUtils
import com.ydl.ydlcommon.utils.YDLCacheUtils
import com.ydl.ydlcommon.utils.remind.HttpErrorUtils
import com.yidianling.consultant.http.ExpertSearchDataManager
import com.yidianling.consultant.model.SearchApi
import com.yidianling.consultant.model.bean.AllFilter
import com.yidianling.consultant.model.bean.ExpertSearchBean
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers

/**
 * 专家搜索页Presenter
 */
class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() {

    @SuppressLint("CheckResult")
    fun fetchListHead() {
        SearchApi.getSearchApi()
                .searchConditions()
                .compose(RxLifecycleUtils.bindToLifecycle(mView!!))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
                .compose(RxUtils.resultJavaData())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ resp ->
                    mView.onHeadFetched(resp)
                }, { t ->
                    HttpErrorUtils.handleError(BaseApp.getApp(), t)
                    mView.fetchFailed(t.message)
                })
    }

    /**
     * 加载缓存
     */
    fun localData(showType : Int){
        YDLAsyncUtils.asyncAsResult(object : YDLAsyncUtils.AsyncObjecyerResult{
            override fun doAsyncAction(): Any {
                return when(showType){
                    0 ->{//按专家
                        YDLCacheUtils.getDoctorListData()
                    }
                    1 ->{//按服务
                        YDLCacheUtils.getServerListData()
                    }
                    else ->{
                        YDLCacheUtils.getServerListData()
                    }
                }
            }

            override fun asyncResult(`object`: Any?) {
                //如果没有缓存数据，显示加载框
                if (`object` !is String || TextUtils.isEmpty(`object`)){
                    mView.showRefreshLayout()
                }

                if (`object` is String){
                    val gson = Gson()
                    val bean = gson.fromJson<ExpertSearchBean>(`object`,ExpertSearchBean::class.java)
//                    val bean = gson.fromJson<ExpertSearchBean>(`object`, object : TypeToken<ExpertSearchBean>() {}.type)
                    if(bean?.list != null){
                        when(showType){
                            0 ->{
                                mView.onDoctorListFetched(bean.list, 1, 1)
                            }
                            1 ->{
                                mView.onServiceListFetched(bean.list, 1, 1)
                            }
                            else ->{
                                mView.onServiceListFetched(bean.list, 1, 1)
                            }
                        }

                    }
                }
            }
        })
    }

    fun updateCache(showType: Int,searchBean: ExpertSearchBean){
        val gson = Gson()
        val json = gson.toJson(searchBean)
        when(showType){
            0 ->{
                YDLCacheUtils.saveDoctorListData(json)
            }
            1 ->{
                YDLCacheUtils.saveServerListData(json)
            }
        }
    }

    @SuppressLint("CheckResult")
    fun fetchListData(allFilter: AllFilter, page: Int) {
        var showType = 0

        val sb = StringBuffer()
        sb.append("searchWord=").append(if(TextUtils.isEmpty(allFilter.searchWord)) "" else allFilter.searchWord)
        if (allFilter.categories.isNotEmpty()) {
            var categorys = allFilter.categories.map { it.cateId }.joinToString(",")
            if ("0" == categorys) {
                categorys = ""
            }
            sb.append("&categories=").append(categorys)
        }
        if (allFilter.sub.key != null) {
            sb.append("&city=").append(Integer.parseInt(allFilter.sub.key))
        }
        if (allFilter.region.key != null) {
            sb.append("&province=").append(Integer.parseInt(allFilter.region.key))
        }
        if (allFilter.reorder.key != null) {
            sb.append("&reorder=").append(allFilter.reorder.key)
        }
        if (allFilter.enquiries.isNotEmpty()) {
            sb.append("&enquirys=").append(allFilter.enquiries.map { it.key }.joinToString(","))
        }
        if (allFilter.ages.isNotEmpty()) {
            sb.append("&ages=").append(allFilter.ages.map { it.key }.joinToString(","))
        }
        if (allFilter.others.isNotEmpty()) {
            sb.append("&others=").append(allFilter.others.map { it.key }.joinToString(","))
        }
//        if (allFilter.showType.key != null) {
//            showType = allFilter.showType.key!!
//            sb.append("&showType=").append(allFilter.showType.key!!)
//        }
        if(allFilter.title.isNotEmpty()){
            sb.append("&title=").append(allFilter.title.map { it.key }.joinToString(","))
        }
        if (allFilter.priceRanges !=null) {
            sb.append("&minPrice=").append(allFilter.priceRanges?.minPrice)
            sb.append("&maxPrice=").append(allFilter.priceRanges?.maxPrice)
        }
        sb.append("&page=").append(page)
        ExpertSearchDataManager.getHttp().searchDoctor(sb.toString())
            .compose(RxLifecycleUtils.bindToLifecycle(mView!!))
            .compose(RxUtils.resultJavaData())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Consumer {
                if (null != it.list && !it.list!!.isEmpty()) {
//                    if (showType == 0) {
//                        mView.onDoctorListFetched(it.list!!, page, it.pages)
//                    } else {
//                        mView.onServiceListFetched(it.list!!, page, it.pages)
//                    }
                    mView.onDoctorListFetched(it.list!!, page, it.pages)
                    //更新缓存 只更新第一页的缓存
                    if (page == 1){
                        updateCache(showType,it)
                    }
                } else {
                    mView.fetchListEmpty("没有搜到相关信息，换个关键词看看吧")
                }
            }, object : ThrowableConsumer() {
                override fun accept(msg: String) {
                    mView.fetchListFailed(msg)
                }
            })
    }
}