package com.ydl.confide.home

import android.content.Context
import android.os.Build
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.SimpleItemAnimator
import android.view.View
import android.widget.LinearLayout
import com.alibaba.android.arouter.facade.annotation.Route
import com.jcodecraeer.xrecyclerview.ProgressStyle
import com.jcodecraeer.xrecyclerview.XRecyclerView
import com.ydl.confide.R
import com.ydl.confide.home.adapter.ConfideHomeAdapter
import com.ydl.confide.home.bean.ConfideHomeAllFiltersBean
import com.ydl.confide.home.bean.ConfideHomeBodyBean
import com.ydl.confide.home.bean.ConfideHomeDataBean
import com.ydl.confide.home.bean.ConfideHomeFiterItemBean
import com.ydl.confide.home.config.IConfideHomeConfig
import com.ydl.confide.home.contract.IConfideHomeContract
import com.ydl.confide.home.event.ConfideHomeEventImpl
import com.ydl.confide.home.event.IConfideHomeEvent
import com.ydl.confide.home.listener.ConfideHomeRecycleViewListener
import com.ydl.confide.home.listener.ConfideHomeRecyleSuspendListener
import com.ydl.confide.home.presenter.ConfideHomePresenterImpl
import com.ydl.confide.home.util.ConfideHomeUtils
import com.ydl.confide.router.PhoneCallIn
import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener
import com.ydl.ydlcommon.mvp.lce.BaseLceActivity
import com.ydl.ydlcommon.utils.StatusBarUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.DrawableRightTextView
import com.ydl.ydlcommon.view.WrapContentLinearLayoutManager
import com.yidianling.common.tools.RxImageTool
import kotlinx.android.synthetic.main.confide_home_activity.*
import kotlinx.android.synthetic.main.confide_title_bar.*

/**
 * @author yuanwai
 * @描述:倾诉首页Activity
 * @Copyright Copyright (c) 2018
 * @Company 壹点灵
 * @date 2018/8/10
 */
@Route(path = "/confide/home")
class ConfideHomeActivity : BaseLceActivity<IConfideHomeContract.View,IConfideHomeContract.Presenter>(),IConfideHomeContract.View,XRecyclerView.LoadingListener {

    override fun getContentViewId(): Int {
        return R.id.rv_list
    }

    override fun getStateViewId(): Int {
        return R.id.lce_state_view
    }

    override fun reLoadData() {

    }


    //是否从启动页直接进入
    var isSplash: Boolean = false
    /**
     * 倾诉首页适配器
     */
    private var mConfideAdapter: ConfideHomeAdapter? = null
    /**
     * 倾诉首页事件处理类
     */
    private var mConfideEvent: IConfideHomeEvent? = null

    /**
     * 数据缓存
     */
    private var cacheList: MutableList<ConfideHomeDataBean>? = null

    // 一键倾诉Url
    private var quickConsultUrl: String? = null

    /**
     * 页(从第二页开始)
     */
    private var page: Int = 2
    //筛选参数bean
    private var allFiltersBean: ConfideHomeAllFiltersBean? = null
    //用于置顶筛选模块监听
    private var listScrollListener: ConfideHomeRecycleViewListener? = null
    //用于显示筛选悬浮View
    private var listSuspendListener: ConfideHomeRecyleSuspendListener? = null
    //是否有下一页(用于判断为你推荐条数,如果首页返回少于10条 那么就可以认为没有下一页了) 默认有下一页
    private var hasMore = true
    private var dp48 = 0

    init {
        //初始化参数
        initParam()
        dp48 = RxImageTool.dip2px(48f)
    }

    private fun initParam() {
        allFiltersBean = ConfideHomeAllFiltersBean(
                page,
                ConfideHomeFiterItemBean("1", ""),
                ConfideHomeFiterItemBean("-1", ""),
                ArrayList(),
                ArrayList())
    }

    override fun getContext(): Context {
        return ConfideHomeActivity@ this
    }

    override fun createPresenter(): IConfideHomeContract.Presenter {
        return ConfideHomePresenterImpl()
    }

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

    /**
     * 下拉刷新回调
     */
    override fun onRefresh() {
        //重置页
        page = 2
        allFiltersBean!!.page = page
        mPresenter.confideHomeRequest(true)
    }

    /**
     * 上拉加载更多
     */
    override fun onLoadMore() {
        recommendList(page)
        page++
    }

    override fun recommendList(page: Int) {
        //需要将当前列表已存在的老师uid数组发送到后端去重,因为排序实时变化
        this.page = page
        allFiltersBean!!.page = page
        if (1 == page) {
            //显示加载中
            showProgressDialog()
            allFiltersBean!!.notInUid = ArrayList()
            mPresenter.recommendList(ConfideHomeUtils.createParam(allFiltersBean!!))
        } else if (page > 1) {
            var listData = mConfideAdapter?.getList()
            var notUidList = ArrayList<Int>()
            if (listData!=null){
                for (bean in listData){
                    //列表类型数组
                    if (bean.type==5 && bean.body!=null){
                        for (bean in bean.body){
                            notUidList.add(bean.uid?:0)
                        }
                    }
                }
            }
            allFiltersBean!!.notInUid = notUidList
            mPresenter.recommendListMore(ConfideHomeUtils.createParam(allFiltersBean!!))
        }
    }

    override fun initDataAndEvent() {
        isSplash = intent.getBooleanExtra("isSplash", false)
        //初始化View
        initView()
        mConfideEvent = ConfideHomeEventImpl(this, this)
        //初始化适配器
        initAdapter()
        //显示加载中
//        showProgressDialog()
        //加载本地缓存
        mPresenter.loadLocalData(this)

        initClick()
        initQuickConsultDialog()
        initStatus();
    }


    /**
     * 初始化状态栏位置
     */
    private fun initStatus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4以下不支持状态栏变色
            StatusBarUtils.setTransparentForImageView(this, null)
            val statusBarHeight = StatusBarUtils.getStatusBarHeight(this)
            val lp1 = rl_confide_title_layout.layoutParams as LinearLayout.LayoutParams
            lp1.height = (RxImageTool.dp2px(48f) + statusBarHeight)
            rl_confide_title_layout.setPadding(0, statusBarHeight, 0, 0)
        }
    }

    /**
     * 监听控制一键倾诉浮层的显示与隐藏
     */
    private fun initQuickConsultDialog() {
        rv_list.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                val layoutManager: RecyclerView.LayoutManager = recyclerView?.layoutManager!!
                val linearManager = layoutManager as LinearLayoutManager
                if (linearManager is LinearLayoutManager) {
                    val firstItemPosition = linearManager.findFirstCompletelyVisibleItemPosition()
                    if (firstItemPosition > 3) {
                        quick_consult_card.visibility = View.VISIBLE
                    }else {
                        quick_consult_card.visibility = View.GONE
                    }
                }
            }
        })
    }

    /**
     * 初始化一键倾诉浮层的点击事件
     */
    private fun initClick() {
        quick_consult_btn.setOnClickListener {
            quickConsultUrl?.let {
                mConfideEvent?.categoryClick(quickConsultUrl)
            }
        }
    }

    private fun initView() {
        img_back.setOnClickListener {
            finish()
        }
        img_mine.setOnClickListener {
            mConfideEvent!!.jumpMine()
        }
        ll_bar_root.setOnClickListener {

        }
        //用于滑动筛选模块置顶
        if (null == listScrollListener) {
            listScrollListener = ConfideHomeRecycleViewListener()
        }
        rv_list.addOnScrollListener(listScrollListener)
        //用于显示筛选悬浮按钮
        if (null == listSuspendListener) {
            listSuspendListener = ConfideHomeRecyleSuspendListener()
        }
        rv_list.addOnScrollListener(listSuspendListener)
        rv_list.addOnScrollListener(YDLImageRecyclerOnScrollListener(ConfideHomeActivity@ this))
        if (rv_list.itemAnimator is SimpleItemAnimator) {
            (rv_list.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
        }
    }

    /**
     * 初始化适配器
     */
    private fun initAdapter() {
        if (null == mConfideAdapter) {
            mConfideAdapter = ConfideHomeAdapter(ConfideHomeActivity@ this, mConfideEvent!!, this)
        }
        val layoutManager = WrapContentLinearLayoutManager(this, WrapContentLinearLayoutManager.VERTICAL, false)
        rv_list.layoutManager = layoutManager
        rv_list.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader)
        rv_list.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader)
        rv_list.setArrowImageView(R.drawable.confide_downgrey)
        rv_list.setLoadingListener(this)
        rv_list.adapter = mConfideAdapter
    }

    /**
     * 倾诉首页数据请求结果
     */
    override fun confideHomeResponse(list: MutableList<ConfideHomeDataBean>) {
        initParam()
        hideError()
        updateCacheData(list)
        updateAdapter()
        updateQuickConsultUrl()
        setSuspendListener()
        v_filterView.refreshView()
    }

    /**
     * 设置筛选模块悬浮顶部监听数据
     */
    private fun setSuspendListener() {
        listSuspendListener?.setFilterView(v_filterView)
        listSuspendListener?.setSectionAdapter(mConfideAdapter!!)
    }

    private fun setHideFilterView() {
        v_filterView.visibility = View.INVISIBLE
        v_filterView.setHomeView(this)
    }

    /**
     * 更新一键倾诉按钮url
     */
    private fun updateQuickConsultUrl() {
        //这边用try catch的原因是防止因为接口数据结构变化导致cacheList!![1].body!![1].linkUrl获取失败
        quickConsultUrl = try {
            cacheList!![1].body!![1].linkUrl
        }catch (e: Exception) {
            "https://h5.ydl.com/confideMatch"
        }
    }

    /**
     * 更新适配器数据
     */
    private fun updateAdapter() {
        rv_list.removeAllViews()
        //数据重组
        ConfideHomeUtils.resetData(cacheList!!, v_filterView, listScrollListener!!)
        setHideFilterView()
        mConfideAdapter?.updataItems(cacheList!!)
        mConfideAdapter?.notifyDataSetChanged()
        rv_list.refreshComplete()
    }

    /**
     * 更新适配器数据(用于播放 暂停 状态切换 更新整体数据)
     */
    private fun updateAdapterForPlayStatus() {
        mConfideAdapter!!.updataItems(cacheList!!)
        mConfideAdapter!!.notifyDataSetChanged()
    }

    private fun clearCacheData() {
        if (null == cacheList) {
            cacheList = ArrayList()
        } else {
            (cacheList as ArrayList).clear()
        }
    }

    /**
     * 更新缓存数据
     */
    private fun updateCacheData(list: List<ConfideHomeDataBean>) {
        clearCacheData()
        var soundBean: ConfideHomeDataBean? = null
        for (index in 0 until list.size) {
            //将听声寻人数据取出 最后加入
            when {
                //听声寻人
                list[index].type == IConfideHomeConfig.TYPE_SOUND -> soundBean = list[index]
                //为你推荐
                list[index].type == IConfideHomeConfig.TYPE_RECOMMEND -> {
                    //如果为你推荐的数量大于等于10条 就认为有下一页
                    hasMore = null != list[index].body && list[index].body!!.size >= 10
                    list[index].recommendId = page
                    (cacheList as ArrayList).add(list[index])
                }
                //其他模块正常添加
                else -> (cacheList as ArrayList).add(list[index])
            }
        }
        //听声寻人 放在最后添加
        if (null != soundBean) {
            (cacheList as ArrayList).add(soundBean)
        }
    }

    /**
     * 根据筛选条件 更新为你推荐数据
     */
    private fun updateCacheDataByRecommend(bean: ConfideHomeDataBean) {
        //需要重置一下页码
        page = 2
        if (null == cacheList) {
            cacheList = ArrayList()
        }
        if (bean?.body == null) {
            v_filterView.visibility = View.GONE
        } else if (null != bean.body && bean.body.size < 2) {
            v_filterView.visibility = View.GONE
        } else {
            v_filterView.visibility = View.VISIBLE
        }
        var soundBean: ConfideHomeDataBean? = null
        //从后往前循环 这样remove的时候不会有问题
        for (index in (0..(cacheList!!.size - 1)).reversed()) {
            if (cacheList!![index].type == IConfideHomeConfig.TYPE_RECOMMEND) {
                //移除原有的为你推荐数据
                (cacheList as ArrayList).removeAt(index)
            } else if (cacheList!![index].type == IConfideHomeConfig.TYPE_SOUND) {
                //移除听声寻人数据 重新添加
                soundBean = cacheList!![index]
                (cacheList as ArrayList).removeAt(index)
            }
        }
        if (bean?.body != null) {
            bean.recommendId = page
            //添加为你推荐数据
            (cacheList as ArrayList).addAll(ConfideHomeUtils.getRecommendList(bean))
        }
        //添加听声寻人数据
        if (null != soundBean) {
            (cacheList as ArrayList).add(soundBean)
        }
        listScrollListener?.moveToPosition(rv_list)
    }

    /**
     * 为你推荐 翻页 请求结果
     */
    override fun recommendListMoreResponse(bean: ConfideHomeDataBean) {
        dismissProgressDialog()
        bean.recommendId = page
        if(bean.body?.size?:0==0) {
            rv_list.loadMoreComplete()
            mConfideAdapter!!.notifyDataSetChanged()
            return
        }
        (cacheList as ArrayList).add(bean)
        var size = mConfideAdapter!!.itemCount
        mConfideAdapter!!.addItems(ConfideHomeUtils.getRecommendList(bean))
//        if (bean?.body == null || bean.body!!.size < 10) {
//            rv_list.setNoMore(true)
//        } else {
        rv_list.loadMoreComplete()
//        }

        mConfideAdapter!!.notifyItemInserted(if (size > 0) size + 1 else 0)
    }

    /**
     * 为你推荐 筛选 请求结果
     */
    override fun recommendListResponse(bean: ConfideHomeDataBean) {
        dismissProgressDialog()
        updateCacheDataByRecommend(bean)
        mConfideAdapter!!.updataItems(cacheList!!)
        if (bean?.body == null || bean.body!!.size < 10) {
            rv_list.setNoMore(true)
        } else {
            rv_list.loadMoreComplete()
        }
        mConfideAdapter!!.notifyDataSetChanged()
    }

    /**
     * 倾诉首页数据请求失败
     */
    override fun confideHomeRequestFail() {
        showError()
    }

    override fun showProgress() {
    }


    /**
     * 更新section的播放状态
     * 点击列表中的一个播放按钮 其他播放按钮要显示暂停状态
     * @param sectionId
     * @param index 模块中点击播放的索引位置
     */
    override fun updataPlayStatu(type: Int?, index: Int, recommendId: Int, isPlaying: Boolean) {
        ConfideHomeUtils.changeCacheDataPlay(cacheList, type, index, recommendId)
        updateAdapterForPlayStatus()
    }

    override fun moveToFilter() {
        rv_list.scrollBy(0, 400)
        listScrollListener?.moveToPosition(rv_list)
    }

    override fun showSortPopupWindow(v_line_top: View, tvSort: DrawableRightTextView, bodyBean: ConfideHomeBodyBean?) {
        if (null == allFiltersBean) {
            return
        }
        if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) {
            listScrollListener?.moveToPosition(rv_list)
        }
        mConfideEvent?.showSortPopupWindow(v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!!)
    }

    override fun showSexAgePopupWindow(v_line_top: View, tvSexAge: DrawableRightTextView, bodyBean: ConfideHomeBodyBean?) {
        if (null == allFiltersBean) {
            return
        }
        if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) {
            listScrollListener?.moveToPosition(rv_list)
        }
        mConfideEvent?.showSexAgePopupWindow(v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!!)
    }

    override fun showGoodPopupWindow(v_line_top: View, tvGood: DrawableRightTextView, bodyBean: ConfideHomeBodyBean?) {
        if (null == allFiltersBean) {
            return
        }
        if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) {
            listScrollListener?.moveToPosition(rv_list)
        }
        mConfideEvent?.showGoodPopupWindow(v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!!)
    }

    private fun showError() {
        rv_list.refreshComplete()
    }

    private fun hideError() {
        rv_list.refreshComplete()
        rv_list.visibility = View.VISIBLE
    }

    override fun showError1(msg: String?){
        rv_list.loadMoreComplete()

        msg?.let {
            ToastHelper.show(msg)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mConfideEvent!!.destoryPlayer()
    }

    override fun onBackPressed() {
        if (isSplash) {
            //跳转主页
            PhoneCallIn.getAppService().mainIntent(this)
        }
        super.onBackPressed()
    }
}