package com.yidianling.home.ui.fragment

import android.app.Dialog
import android.content.Context
import android.graphics.Typeface
import android.os.Build
import android.text.TextUtils
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.alibaba.android.arouter.facade.annotation.Route
import com.google.android.material.tabs.TabLayout
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydlcommon.base.BaseMvpFragment
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.*
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.home.R
import com.yidianling.home.adapter.YdlHomeAdapter
import com.yidianling.home.constants.HomeBIConstants
import com.yidianling.home.constract.HomeViewConfig
import com.yidianling.home.constract.IHomeContract
import com.yidianling.home.dialog.ActivityDialog
import com.yidianling.home.dialog.ActivityGuideDialog
import com.yidianling.home.event.HomeImpl
import com.yidianling.home.listener.HomeConfideRecyleSuspendListener
import com.yidianling.home.model.bean.*
import com.yidianling.home.presenter.HomePresenterImpl
import com.yidianling.home.ui.view.CouponDialog
import com.yidianling.home.ui.view.HomeSpaceItemDecoration
import com.yidianling.home.utils.HomeAnimUtils
import com.yidianling.user.api.service.IUserService
import kotlinx.android.synthetic.ydl.home_fragment.*


/**
 * @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
 * @描述: 壹点灵首页fragment
 * @Copyright Copyright (c) 2019
 * @Company 壹点灵
 * @date 2019/02/12
 */
@Route(path = "/home/home")
open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>(),
    IHomeContract.View,
    SwipeRefreshLayout.OnRefreshListener {
    private lateinit var mActivity:FragmentActivity
    private lateinit var mContext:Context
    open var adapter: YdlHomeAdapter? = null
    open var homeEvent: HomeImpl? = null
    open var dialog: CouponDialog? = null

    //双11活动弹窗
    open var aa: Dialog? = null


    /**
     * tablayou上次选中的tab下标
     */
    private var confideLastSelectPosition = 0
    private var confideLastSelectType = ""

    /**
     * TabLayout.OnTabSelectedListener
     */
    private var consultTabListener: TabLayout.OnTabSelectedListener? = null
    private var confideTabListener: TabLayout.OnTabSelectedListener? = null

    /**
     * 咨询tablayout上次选中的下标
     */
    private var consultLastSelectPosition = 0
    private var consultLastSelectType = ""

    /**
     * 悬浮tablayout监听事件
     */
    open lateinit var scrollListner: HomeConfideRecyleSuspendListener

    //咨询模块数据缓存
    private var consultCategoryDate: MutableList<HomeHeaderBean.ConsultCategoryDateBean>? = null

    open var searchText: String = ""
    open var doctorName: String = ""
    var startTime =0L
    var endTime =0L

    /**
     * 如果是第一次加载,则调用所有接口进行刷新,否则,只调用咨询和倾诉接口
     */
    private var isFromCreate: Boolean = true

    override fun layoutResId(): Int {
        return R.layout.home_fragment
    }

    override fun initDataAndEvent() {
        mActivity = requireActivity()
        mContext = requireContext()
        initHomeEvent()
        initView()
        initTopButtonBanner()
        initAdapter()
    }

    open fun initHomeEvent() {
        homeEvent = HomeImpl(mActivity, this)
    }

    private fun initAdapter() {
        mPresenter?.localHomeData(mContext, "home_data.json")
        adapter = YdlHomeAdapter(mContext, homeEvent!!, ArrayList())
        val layoutManager = LinearLayoutManager(context)
        home_module_fragment_recycler.layoutManager = layoutManager
        home_module_fragment_recycler.adapter = adapter
        val space = resources.getDimension(R.dimen.platform_dp_24).toInt()
        home_module_fragment_recycler.addItemDecoration(HomeSpaceItemDecoration(space))
        initRvListener()
    }

    open fun initRvListener() {
        if (HomeViewConfig.getOrder().bannerIndex != -1) {
            home_module_fragment_recycler.addOnScrollListener(
                homeEvent!!.onPageScroll(
                    view_rl_top_bg
                )!!
            )
        }
        scrollListner = HomeConfideRecyleSuspendListener()
        home_module_fragment_recycler.addOnScrollListener(scrollListner)
        setSuspendListener()
    }

    private fun initView() {
        if (HomeViewConfig.getOrder().bannerIndex == null || HomeViewConfig.getOrder().bannerIndex == -1) {
            var marginTop = this.resources.getDimension(R.dimen.home_home_title_bar_height)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4以下不支持状态栏变色
                val statusBarHeight = StatusBarUtils.getStatusBarHeight(mActivity)
                marginTop += statusBarHeight
            }
            val lp = home_swipe_refresh_layout.layoutParams as FrameLayout.LayoutParams
            lp.topMargin = marginTop.toInt()
            home_swipe_refresh_layout.layoutParams = lp
        }
        searchText = this.resources.getText(R.string.home_search_hint).toString()
        home_swipe_refresh_layout?.setOnRefreshListener(this)
        home_swipe_refresh_layout?.setColorSchemeColors(
            ContextCompat.getColor(
                mContext,
                R.color.platform_main_theme
            )
        )
        home_swipe_refresh_layout?.setProgressViewOffset(false, 0, 200)
        home_service_call.setOnClickListener { homeEvent?.serviceCallClick() }
        initSearchBar()
        initStatus()
    }

    open fun initSearchBar() {
        if (!TextUtils.isEmpty(doctorName)) {
            searchText = doctorName
        }
        home_tv.setOnClickListener { homeEvent?.searchTvClick(searchText) }
        home_tv.text = searchText
    }

    /**
     * 初始化状态栏位置
     */
    private fun initStatus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4以下不支持状态栏变色
            val statusBarHeight = StatusBarUtils.getStatusBarHeight(mActivity)
            var homeTitleBarHeight = resources.getDimension(R.dimen.home_home_title_bar_height)
            val lp1 = view_rl_top_bg.layoutParams as RelativeLayout.LayoutParams
            lp1.height = (homeTitleBarHeight + statusBarHeight).toInt()
            view_rl_top_bg.layoutParams = lp1

            val lp2 = rl_top.layoutParams as RelativeLayout.LayoutParams
            lp2.topMargin = statusBarHeight
            rl_top.layoutParams = lp2
        }
    }

    override fun initDataAndEventLazy() {
    }

    /**
     * 设置顶部导航栏 功能点击事件
     */
    private fun initTopButtonBanner() {

        tv_consult.setOnClickListener {
            homeEvent?.reservationExpertsClick()
        }
        tv_confide.setOnClickListener {
            homeEvent?.nowConfideClick(adapter?.listenFree ?: false)
        }
        tv_course.setOnClickListener {
            homeEvent?.psychologyClassClick()
        }
        tv_test.setOnClickListener {
            homeEvent?.psychologyTestClick()
        }
        rl_backTop.setOnClickListener {
            home_module_fragment_recycler.scrollToPosition(0)
        }
    }

    override fun startAnim() {
        HomeAnimUtils.startAnim(mContext, rl_top, rl_search, home_service_call, home_tv)
        HomeAnimUtils.startSearchShow(
            ll_top_function,
            view_search_input_bg,
            home_tv,
            iv_search_icon,
            img_ad
        )
    }

    override fun endAnim() {
        HomeAnimUtils.endAnim(mContext, rl_top, rl_search, home_tv, home_service_call, this)
        HomeAnimUtils.startSearchHide(
            ll_top_function,
            view_search_input_bg,
            home_tv,
            iv_search_icon,
            img_ad
        )
    }

    override fun getSearchContent(): String {
        return searchText
    }

    override fun createPresenter(): HomePresenterImpl {
        return HomePresenterImpl()
    }

    override fun onRefresh() {
        home_swipe_refresh_layout.isRefreshing = true
        mPresenter?.refreshHomeData()
    }

    override fun resetModuleTabPosition() {
        adapter?.confideSelectPosition = 0
        adapter?.consultSelectPosition = 0
    }


    /**
     * 设置悬浮顶部监听数据
     */
    private fun setSuspendListener() {
        scrollListner.setContext(mContext)
        scrollListner.setHomeView(this)
        scrollListner.setConfideFilterView(ll_layout)
        scrollListner.setConsultFilterView(ll_consultLayout)
        scrollListner.setSectionAdapter(adapter!!)
        scrollListner.setPhoneCallImageView(home_service_call)
    }

    /**
     * 获取倾述列表数据
     * @param type 倾述类型
     * @param selectPosition 选中的position
     */
    override fun getConfideData(type: String, selectPosition: Int) {
        confideLastSelectPosition = selectPosition
        confideLastSelectType = type
        mPresenter?.getConfideData(type, selectPosition)
    }

    /**
     * 获取咨询列表数据
     */
    override fun getConsultData(type: String, selectPosition: Int) {
        consultLastSelectPosition = selectPosition
        consultLastSelectType = type
        mPresenter?.getConsultData(type, selectPosition)
    }

    override fun homeHeadResponse(homeHeaderBean: HomeHeaderBean) {
        //更新倾述列表数据
        adapter?.updateConfideFreeData(homeHeaderBean)
        //展示活动数据
        val act = homeHeaderBean.activityResponse

        if (act != null) {
            if (!TextUtils.isEmpty(act!!.imageUrl)) {
                img_ad.visibility = View.VISIBLE
                ActionCountUtils.count(HomeBIConstants.YDL_HOME_SEARCH_TAG,act.title?:"1")

                GlideApp.with(this).load(act!!.imageUrl).into(img_ad)
                img_ad.setOnClickListener {
                    if (Utils.isFastClick()) {
                        //防止连击
                        return@setOnClickListener
                    }
                    if (act.btnLinkurl != null && act.btnLinkurl!!.startsWith("http")) {
                        NewH5Activity.start(activity, H5Params(act.btnLinkurl!!, null))
                    } else {
                        YDLRouterManager.router(act.btnLinkurl)
                    }
                    //定制咨询点击事件埋点
                    ActionCountUtils.count(HomeBIConstants.YDL_HOME_SEARCH_TAG_CLICK,act.title?:"1")
                }
            } else {
                img_ad.visibility = View.GONE
            }

            if (!TextUtils.isEmpty(act.imageBanner)) {
                val va = SharedPreferencesEditor.getString(act.imageBanner)
                if (TextUtils.equals("yes", va)) {
                    //已经显示过,不再弹出
                    return
                }
            }

            if (!ModularServiceManager.provide(IUserService::class.java).isLogin()) {
                //未登录不显示
                return
            }
            if (!TextUtils.isEmpty(act.imageBanner)) {
                //展示弹窗
                if (aa == null) {
                    ActionCountUtils.count(HomeBIConstants.YDL_HOME_POPUPWINDOWS_PAGE_POPUP,act?.title?:"1")
                    aa = ActivityDialog(mActivity, act.imageBanner, act.linkUrl, act.title)
                    aa?.show()
                    aa?.setOnDismissListener {
                        //文案不为空才显示引导--李思开
                        if (!TextUtils.isEmpty(act.title)) {
                            ActivityGuideDialog(mActivity, act.imageUrl, act.title).show()
                        }
                    }
                }
                //仅展示一次,以后不再展示
                SharedPreferencesEditor.putString(act.imageBanner, "yes")
            }
        }
    }

    override fun homeDataResponse(list: MutableList<HomePagerDataBean>) {
        home_swipe_refresh_layout.isRefreshing = false
        //更新首页数据
        adapter?.updateItems(list)
        if (!TextUtils.isEmpty(list[0].headerBean?.doctorName)) {
            doctorName = list[0].headerBean?.doctorName!!
            initSearchBar()
        }

        //每次全局更新后重置下标位
        confideLastSelectPosition = 0
        consultLastSelectPosition = 0
        //初始化fragment中的tablayout布局,悬停效果使用
        for (bean in list) {
            //咨询模块
            if (bean.type == HomeViewConfig.getOrder().bannerIndex) {
                initTabLayout(bean.headerBean!!.listenCategoryDate)
                initConsultTabLayout(bean.headerBean!!.consultCategoryData)
                consultLastSelectType = bean.headerBean!!.consultCategoryData!![0].id.toString()
            }
        }
    }

    /**
     * 初始化fragment中的tablayout布局,悬停效果使用
     */
    private fun initTabLayout(listenCategoryDate: List<HomeHeaderBean.ListenCategoryDateBean>?) {
        if (confideTabListener == null) {
            confideTabListener = ConfideExpertTabSelectedListener(listenCategoryDate!!, tab_layout)
            tab_layout.addOnTabSelectedListener(confideTabListener!!)
        }

        tab_layout.removeAllTabs()
        for ((index, bean) in listenCategoryDate!!.withIndex()) {
            tab_layout.addTab(
                tab_layout.newTab().setText(bean.name),
                index == confideLastSelectPosition
            )
        }
        var textView =
            ((tab_layout!!.getChildAt(0) as LinearLayout).getChildAt(confideLastSelectPosition) as LinearLayout).getChildAt(
                1
            )
        if (textView != null && textView is TextView) {
            textView.textSize = 17f
            textView.setTextColor(ContextCompat.getColor(mActivity, R.color.platform_color_242424))
            textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
        }
    }

    /**
     * 初始化fragment中咨询tablayout布局,悬停效果使用
     */
    private fun initConsultTabLayout(listenCategoryDate: List<HomeHeaderBean.ConsultCategoryDateBean>?) {
        if (consultTabListener == null) {
            consultTabListener =
                ConsultExpertTabSelectedListener(listenCategoryDate!!, tab_consultLayout)
            tab_consultLayout.addOnTabSelectedListener(consultTabListener!!)
        }
        if (null == consultCategoryDate) {
            consultCategoryDate = ArrayList()
        }
        //如果 数据不变 则不重新构建
        if (null != listenCategoryDate && consultCategoryDate!!.size == listenCategoryDate.size && consultCategoryDate!!.retainAll(
                listenCategoryDate
            )
        ) {
            return
        }
        consultCategoryDate?.clear()
        if (null != listenCategoryDate) {
            consultCategoryDate?.addAll(listenCategoryDate)
        }
        tab_consultLayout.removeAllTabs()
        for ((index, bean) in listenCategoryDate!!.withIndex()) {
            tab_consultLayout.addTab(
                tab_consultLayout.newTab().setText(bean.name),
                index == confideLastSelectPosition
            )
        }

        val textView = ((tab_consultLayout!!.getChildAt(0) as LinearLayout).getChildAt(
            confideLastSelectPosition
        ) as LinearLayout).getChildAt(1)
        if (textView != null && textView is TextView) {
            textView.textSize = 17f
            textView.setTextColor(ContextCompat.getColor(mActivity, R.color.platform_color_242424))
            textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
        }
    }

    override fun confideDataResponse(data: HomeConfideBean, selectPosition: Int) {
        //更新倾述列表数据
        adapter?.updateConfideData(data, selectPosition)
    }

    override fun consultDataResponse(data: HomeConsultBean, selectPosition: Int) {
        //更新咨询列表数据
        adapter?.updateConsultData(data, selectPosition)
    }

    override fun askDataResponse(data: HomeAskBean, position: Int) {
        //更新问答模块数据
        adapter?.updateAskData(data, position)
    }

    override fun homeDataFail(msg: String) {
        home_swipe_refresh_layout?.isRefreshing = false
//        ToastHelper.show(msg)
    }

    override fun askZan(position: Int, index: Int, id: String) {
        mPresenter?.askZan(position, index, id)
    }

    override fun askFocus(position: Int, id: String) {
        mPresenter?.askFocus(position, id)
    }

    override fun showHomeProgress() {
        showHomeProgress()
    }

    override fun showRefreshLayout() {
        home_swipe_refresh_layout?.isRefreshing = true
    }

    override fun dismissHomeProgress() {
        dismissHomeProgress()
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser && isResumed) {
            startTime=System.currentTimeMillis()
            showConsultAssistantDialog()
        } else {
            hideConsultAssistantDialog()
            if (startTime!=0L){
                endTime=System.currentTimeMillis()
                ActionCountUtils.count(HomeBIConstants.YDL_HOME_DWELL_TIME,(endTime-startTime).toString())
                startTime=0L
            }

        }
        if (isVisibleToUser && isResumed) {
            onResume()
        }
    }

    private fun showConsultAssistantDialog() {
        ModularServiceManager.provide(IConsultantService::class.java)
            .showConsultAssistantDialog(mActivity)
    }

    private fun hideConsultAssistantDialog() {
        ModularServiceManager.provide(IConsultantService::class.java).hideConsultAssistantDialog()
    }


    override fun onResume() {
        super.onResume()
        if (userVisibleHint) {
            if (isFromCreate) {
                isFromCreate = false
                mPresenter?.loadHomeData()
            } else {
                mPresenter?.loadHomeData()
                mPresenter?.getConsultData(consultLastSelectType, consultLastSelectPosition)
                mPresenter?.getConfideData(confideLastSelectType, confideLastSelectPosition)
            }
            ActionCountUtils.count(HomeBIConstants.YDL_USER_MAIN_PAGE_VISIT)
            ActionCountUtils.count("daoyi_advertisement_page|daoyi_advertisement_visit","1")
            showConsultAssistantDialog()
        }
    }

    override fun onPause() {
        super.onPause()
        if (startTime!=0L){
            endTime=System.currentTimeMillis()
            ActionCountUtils.count(HomeBIConstants.YDL_HOME_DWELL_TIME,(endTime-startTime).toString())
            startTime=0L
        }
    }

    /**
     * 咨询楼层tablayout
     */
    inner class ConsultExpertTabSelectedListener : TabLayout.OnTabSelectedListener {
        private var list: List<HomeHeaderBean.ConsultCategoryDateBean>? = null
        private var tabLayout: TabLayout? = null

        constructor(list: List<HomeHeaderBean.ConsultCategoryDateBean>, tabLayout: TabLayout) {
            this.list = list
            this.tabLayout = tabLayout
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
            var textView =
                ((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
                    1
                )
            if (textView != null && textView is TextView) {
                textView.textSize = 15f
                textView.setTextColor(
                    ContextCompat.getColor(
                        activity!!,
                        R.color.platform_color_333333
                    )
                )
            }
        }

        override fun onTabSelected(tab: TabLayout.Tab?) {
            if (tab!!.position == consultLastSelectPosition) {
                return
            }
            var textView =
                ((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
                    1
                )
            if (textView != null && textView is TextView) {
                textView.textSize = 17f
                textView.setTextColor(
                    ContextCompat.getColor(
                        activity!!,
                        R.color.platform_color_242424
                    )
                )
                textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
            }
            homeEvent!!.getConsultData(list!![tab!!.position], tab!!.position)
        }
    }

    inner class ConfideExpertTabSelectedListener : TabLayout.OnTabSelectedListener {
        private var list: List<HomeHeaderBean.ListenCategoryDateBean>? = null
        private var tabLayout: TabLayout? = null

        constructor(list: List<HomeHeaderBean.ListenCategoryDateBean>, tabLayout: TabLayout) {
            this.list = list
            this.tabLayout = tabLayout
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
            var textView =
                ((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
                    1
                )
            if (textView != null && textView is TextView) {
                textView.textSize = 15f
                textView.setTextColor(
                    ContextCompat.getColor(
                        activity!!,
                        R.color.platform_color_333333
                    )
                )
            }
        }

        override fun onTabSelected(tab: TabLayout.Tab?) {
            if (tab!!.position == confideLastSelectPosition) {
                return
            }

            var textView =
                ((tabLayout!!.getChildAt(0) as LinearLayout).getChildAt(tab!!.position) as LinearLayout).getChildAt(
                    1
                )
            if (textView != null && textView is TextView) {
                textView.textSize = 17f
                textView.setTextColor(
                    ContextCompat.getColor(
                        activity!!,
                        R.color.platform_color_242424
                    )
                )
                textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
            }
            homeEvent!!.getConfideData(list!![tab!!.position], tab!!.position)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        HomeAnimUtils.clear()
    }
}