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 com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils
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(2)
            .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) {
        //是否亲子教育字段
        ConsultAssistantDialogUtils.REALATION_EDUCATION =
            allFilter.categories.size == 1 && allFilter.categories[0].cateId == "23"
        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("&directionTags=").append(categorys)
        }
       if (allFilter.region.value == "海外"||allFilter.region.value=="全国") {
            sb.append("&country=").append(allFilter.sub.code)
        } else{
            if (allFilter.region.code != null) {
                sb.append("&province=").append(allFilter.region.code)
            }
            if (allFilter.sub.code != null) {
                sb.append("&city=").append(allFilter.sub.code)
            }
        }
        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.specialityCrowd.isNotEmpty()) {
            sb.append("&crowdsTags=")
                .append(allFilter.specialityCrowd.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.isNotEmpty()) {
//                    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)
                }
            })
    }
}