package com.yidianling.consultant

import android.annotation.SuppressLint
import android.text.TextUtils
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.PlatformDataManager
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.mvp.base.SimplePresenter
import com.ydl.ydlcommon.utils.RxLifecycleUtils
import com.ydl.ydlcommon.utils.remind.HttpErrorUtils
import com.yidianling.common.tools.RxAppTool
import com.yidianling.common.tools.ToastUtil
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.Extras
import com.yidianling.user.api.service.IUserService
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers

/**
 * 专家搜索页Presenter
 */
class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() {
    var mExtras: Extras? =null // 用于分页

    @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)
            })
    }

    // 查询底纹词
    @SuppressLint("CheckResult")
    fun fetchFunctionWord(type: Int) {
        val map = HashMap<String, Any>()
        map["type"] = type
        SearchApi.getSearchApi()
            .searchFunctionWord(map)
            .compose(RxLifecycleUtils.bindToLifecycle(mView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
            .compose(RxUtils.resultJavaData())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ resp ->
                mView.onFunctionWordFetched(resp)
            }, { t ->
                HttpErrorUtils.handleError(BaseApp.getApp(), t)
                mView.fetchFailed(t.message)
            })
    }

    @SuppressLint("CheckResult")
    fun fetchListData(allFilter: AllFilter, extras: Extras?) {
        //是否亲子教育字段
//        ConsultAssistantDialogUtils.REALATION_EDUCATION = allFilter.categories.size == 1 && allFilter.categories[0].cateId == "23"

        val map = HashMap<String, Any>()
        // filter
        val filterMap = HashMap<String, Any?>()
        // 搜索词
        if (!TextUtils.isEmpty(allFilter.searchWord)) {
            filterMap["__keywords"] = allFilter.searchWord
        }
        val categoryList = ArrayList<Any>()
        // 八大类一级标签
        if (allFilter.categoryId2List.size>0){
            val categoryMap2 = HashMap<String, Any>()
            val categoryIdMap2 = HashMap<String, Any>()
            categoryIdMap2["in"] = allFilter.categoryId2List.toSortedSet().toList()
            categoryMap2["product_cates.category_id2"] = categoryIdMap2
            categoryList.add(categoryMap2)
        }
        // 八大类二级标签
        if (allFilter.categoryId3List.size>0){
            val categoryMap3 = HashMap<String, Any>()
            val categoryIdMap3 = HashMap<String, Any>()
            categoryIdMap3["in"] = allFilter.categoryId3List.toSortedSet().toList()
            categoryMap3["product_cates.category_id3"] = categoryIdMap3
            categoryList.add(categoryMap3)
        }
        if (categoryList.size>0){
            filterMap["__or"] = categoryList
        }
        // 主题
        if (allFilter.categories.size>0) {
            val categories = ArrayList<String?>()
            allFilter.categories.forEach {
                categories.add(it.cateId)
            }
            val categoriesMap = HashMap<String, Any>()
            categoriesMap["in"] = categories
            filterMap["tags.tag_id"] = categoriesMap
        }
        // 地区
        if (allFilter.region.code == "ABROAD") {        // 海外
           if (allFilter.region.code == allFilter.sub.code){    // 海外不限
               val abroadMap = HashMap<String, Any>()
               abroadMap["ne"] = "1"
               filterMap["country_code"] = abroadMap
           }else{
               filterMap["country_code"] = allFilter.sub.code!!
           }
        } else if(allFilter.region.code=="1"&&allFilter.region.code==allFilter.sub.code){      // 全国不限
            filterMap["country_code"] = allFilter.sub.code
        }else{
            if (allFilter.region.code != null) {
                filterMap["province_code"] = allFilter.region.code
            }
            if (allFilter.sub.code != null&&allFilter.sub.code!=allFilter.region.code) {
                filterMap["city_code"] = allFilter.sub.code
            }
        }
        // 咨询方式
        if (allFilter.enquiries.isNotEmpty()) {
            val way = ArrayList<Int>()
            allFilter.enquiries.forEach {
                way.add(it.key)
            }
            val wayMap = HashMap<String, Any>()
            wayMap["in"] = way
            filterMap["product_specs.spec_id"] = wayMap
        }
        // 服务均价
        allFilter.priceRanges?.let {
            val avgPriceMap = HashMap<String, Any?>()
            if (!TextUtils.isEmpty(it.min_price)){
                avgPriceMap["gte"] = it.min_price
            }
            if (!TextUtils.isEmpty(it.max_price)) {
                avgPriceMap["lte"] = it.max_price
            }
            filterMap[it.key1] = avgPriceMap
        }
        // 年龄
        if (allFilter.ages.isNotEmpty()) {
            val age = ArrayList<Int>()
            allFilter.ages.forEach {
                age.add(it.key)
            }
            val ageMap = HashMap<String, Any>()
            ageMap["in"] = age
            filterMap["years"] = ageMap
        }
        // 资质
        if (allFilter.title.isNotEmpty()) {
            val title = ArrayList<String?>()
            allFilter.title.forEach {
                title.add(it.key)
            }
            val titleMap = HashMap<String, Any>()
            titleMap["in"] = title
            filterMap["titles.title"] = titleMap
        }
        // 擅长人群
        if (allFilter.specialityCrowd.isNotEmpty()) {
            val specialityCrowd = ArrayList<String?>()
            allFilter.specialityCrowd.forEach {
                specialityCrowd.add(it.key)
            }
            val specialityCrowdMap = HashMap<String, Any>()
            specialityCrowdMap["in"] = specialityCrowd
            filterMap["doctor_tag_list.list.tag_id"] = specialityCrowdMap
        }
        // 学历
        if (allFilter.doctorEdu.isNotEmpty()) {
            val edu = ArrayList<Int?>()
            allFilter.doctorEdu.forEach {
                edu.add(it.key)
            }
            val eduMap = HashMap<String, Any>()
            eduMap["in"] = edu
            filterMap["edu"] = eduMap
        }
        // 其它
        if (allFilter.others.isNotEmpty()) {
            val gender = ArrayList<String?>()
            allFilter.others.forEach {
                when (it.key1) {
                    "gender" -> {
                        gender.add(it.value1)
                    }
                    else -> {
                        filterMap[it.key1] = it.value1
                    }
                }
            }
            if (gender.size>0){
                val genderMap = HashMap<String, Any>()
                genderMap["in"] = gender
                filterMap["gender"] = genderMap
            }
        }
        map["filter"] = filterMap

        // sorts
        if (allFilter.reorder.key != null) {
            val sortsMap = HashMap<String, Any>()
            sortsMap[allFilter.reorder.key1] = allFilter.reorder.value1
            map["sorts"] = sortsMap
        }
        // fields
        val fieldsMap = HashMap<String, Any>()
        fieldsMap["doctor_id"] = true
        fieldsMap["doctor_name"] = true
        fieldsMap["uid"] = true
        fieldsMap["chat_status"] = true
        fieldsMap["gender"] = true
        fieldsMap["years"] = true
        fieldsMap["head"] = true
        fieldsMap["edu"] = true
        fieldsMap["province"] = true
        fieldsMap["city"] = true
        fieldsMap["evaluation_average_score"] = true
        fieldsMap["evaluate_num"] = true
        fieldsMap["min_price"] = true
        fieldsMap["title"] = true
        fieldsMap["famous_remark"] = true
        fieldsMap["help_num"] = true
        fieldsMap["p30d_sold_hour"] = true
        fieldsMap["sum_service_time"] = true
        fieldsMap["has_servicefree_consult"] = true
        fieldsMap["is_new_enter"] = true
        fieldsMap["chat_num"] = true
        fieldsMap["chat_btn_text"] = true
        fieldsMap["feature_tags"] = true
        fieldsMap["link_url"] = true
        fieldsMap["open_chat_agency"] = true
        fieldsMap["service_status"] = true
        fieldsMap["is_free_today"] = true
        fieldsMap["display_region"] = true
        fieldsMap["has_servicefree_experience"] = true
        map["fields"] = fieldsMap

        val optionsMap = HashMap<String, Any?>()
        optionsMap["search_scene_id"] = "doctor_main_search"
        optionsMap["uid"] = ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
        optionsMap["ffrom"] = PlatformDataManager.getRam().getChannelName()
        optionsMap["version"]= RxAppTool.getAppVersionName(BaseApp.getApp())
        optionsMap["os_type"]= 2
        if (extras!=null){
            optionsMap["extras"] = extras
        }
        map["options"] = optionsMap


        ExpertSearchDataManager.getHttp()
            .getExpertList(map)
            .compose(RxLifecycleUtils.bindToLifecycle(mView))
            .compose(RxUtils.resultJavaData())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Consumer {
                // 当前页数
                val curPage = (it.skip/it.limit)+1
                if (curPage==1&&it.objects.size==0){
                    mView.fetchListEmpty("没有搜到相关信息,换个关键词看看吧")
                }else{
                    mExtras = it.extras
                    mView.onDoctorListFetched(it.objects, mExtras,curPage)
                }
            }, object : ThrowableConsumer() {
                override fun accept(msg: String) {
                    ToastUtil.toastShort(msg)
                    mView.fetchListFailed(msg)
                }
            })
    }


    @SuppressLint("CheckResult")
    fun fetchPromptPayment() {
        SearchApi.getSearchApi()
            .promptPayment()
            .compose(RxLifecycleUtils.bindToLifecycle(mView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
            .compose(RxUtils.resultJavaData())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { resp ->
                mView.showPromptPayment(resp)
            }
    }
}