package com.ydl.confide.home.util

import android.content.Context
import android.content.Intent
import android.support.v4.content.ContextCompat
import android.support.v7.widget.AppCompatTextView
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.view.View
import android.view.animation.AnimationUtils
import android.view.animation.LinearInterpolator
import android.widget.ImageView
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.config.IConfideHomeConfig
import com.ydl.confide.home.contract.IConfideHomeContract
import com.ydl.confide.home.event.IConfideHomeEvent
import com.ydl.confide.home.http.ConfideRecommendParam
import com.ydl.confide.home.listener.ConfideHomeRecycleViewListener
import com.ydl.confide.home.section.*
import com.ydl.confide.home.widget.ConfideHomeFilterView
import com.ydl.confide.home.widget.ConfidePlayerFloatView
import com.ydl.ydlcommon.adapter.section.SectionAdapter
import com.ydl.ydlcommon.utils.MainUtils
import com.yidianling.common.tools.LogUtil
import java.io.BufferedInputStream
import java.io.IOException
import java.io.InputStream

/**
 * @author yuanwai
 * @描述:倾诉首页工具类
 * @Copyright Copyright (c) 2018
 * @Company 壹点灵
 * @date 2018/8/10
 */
class ConfideHomeUtils {
    companion object {
        /**
         * 读取Assets下文本文件
         */
        fun getAssertsFile(context: Context, fileName: String): ByteArray? {
            var inputStream: InputStream? = null
            val assetManager = context.assets
            try {
                inputStream = assetManager.open(fileName)
                if (inputStream == null) {
                    return null
                }

                var bis: BufferedInputStream? = null
                val length: Int
                try {
                    bis = BufferedInputStream(inputStream)
                    length = bis.available()
                    val data = ByteArray(length)
                    bis.read(data)

                    return data
                } catch (e: IOException) {

                } finally {
                    if (bis != null) {
                        try {
                            bis.close()
                        } catch (e: Exception) {

                        }
                    }
                }

                return null
            } catch (e: IOException) {
                e.printStackTrace()
            }

            return null
        }

        /**
         * 数据重组
         */
        fun resetData(list: MutableList<ConfideHomeDataBean>, filterView: ConfideHomeFilterView, listScrollListener: ConfideHomeRecycleViewListener) {
            val recommendList: MutableList<ConfideHomeDataBean> = ArrayList()
            var soundDataBean: ConfideHomeDataBean? = null
            for ((index, dataBean) in list.withIndex().reversed()) {
                //给隐藏的为你推荐筛选view赋值
                if (dataBean.type == IConfideHomeConfig.TYPE_RECOMMEND_FILTER) {
                    listScrollListener.setFilterIndex(index)
                    filterView.initData(dataBean)
                }
                //拆分为你推荐数据
                if (dataBean.type == IConfideHomeConfig.TYPE_RECOMMEND) {
                    //如果是为你推荐数据 则进行筛分
                    recommendList.addAll(getRecommendList(dataBean))
                    //移除当前 为你推荐数据
                    list.removeAt(index)
                }
                //移除听声寻人数据 放在最后
                if (dataBean.type == IConfideHomeConfig.TYPE_SOUND) {
                    soundDataBean = ConfideHomeDataBean(dataBean.type, dataBean.body, dataBean.head, dataBean.footer, dataBean.recommendId, dataBean.diviLine)
                    list.removeAt(index)
                }
            }
            //添加 拆分后的 为你推荐数据
            list.addAll(recommendList)
            //添加 听声寻人 数据
            if (null != soundDataBean) {
                list.add(soundDataBean)
            }
        }

        /**
         * 筛分 为你推荐数据 并返回集合
         */
        fun getRecommendList(dataBean: ConfideHomeDataBean): MutableList<ConfideHomeDataBean> {
            var list: MutableList<ConfideHomeDataBean> = ArrayList()
            if (null == dataBean || null == dataBean.body || dataBean.body.isEmpty()) {
                return list
            }
            for (bodyBean in dataBean.body) {
                val bodyList: MutableList<ConfideHomeBodyBean> = ArrayList()
                bodyList.add(bodyBean)
                val recommendDataBean = ConfideHomeDataBean(dataBean.type, bodyList, dataBean.head, dataBean.footer, dataBean.recommendId, dataBean.diviLine)
                list.add(recommendDataBean)
            }
            return list
        }

        /**
         * 构建section适配器数据
         * @param context 上下文
         * @param view confideHomeActivity view层接口
         * @param list 数据集合
         * @param mConfideAdapter section适配器
         * @param mConfideEvent 首页点击事件处理类
         */
        fun createScetion(context: Context, view: IConfideHomeContract.View, list: List<ConfideHomeDataBean>, mConfideAdapter: SectionAdapter, mConfideEvent: IConfideHomeEvent, filterView: ConfideHomeFilterView, listScrollListener: ConfideHomeRecycleViewListener) {
            for ((index, resultBean) in list.withIndex()) {
                //给隐藏的为你推荐筛选view赋值
                if (resultBean.type == IConfideHomeConfig.TYPE_RECOMMEND_FILTER) {
                    listScrollListener.setFilterIndex(index)
                    filterView.initData(resultBean)
                }
                createScetion(context, view, resultBean, mConfideAdapter, mConfideEvent)
            }
        }

        /**
         * 构建section适配器数据
         * @param context 上下文
         * @param view confideHomeActivity view层接口
         * @param resultBean 数据
         * @param mConfideAdapter section适配器
         * @param mConfideEvent 首页点击事件处理类
         */
        fun createScetion(context: Context, view: IConfideHomeContract.View, resultBean: ConfideHomeDataBean?, mConfideAdapter: SectionAdapter, mConfideEvent: IConfideHomeEvent) {
            if (null == resultBean) {
                return
            }
            when (resultBean!!.type) {
                //banner
                IConfideHomeConfig.TYPE_BANNER -> {
                    var section = ConfideHomeBannerSection(context, mConfideEvent)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
                //分类
                IConfideHomeConfig.TYPE_CATEGORY -> {
                    var section = ConfideHomeCategorySection(context, mConfideEvent, view)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
                //最佳倾诉榜单 todo 产品说先隐藏掉
                IConfideHomeConfig.TYPE_CONSULTANT -> {
//                    var section = ConfideHomeRecommendExpertSection(context,mConfideEvent)
//                    section.setData(resultBean)
//                    mConfideAdapter?.addSection(section)
                }
                //为你推荐筛选模块
                IConfideHomeConfig.TYPE_RECOMMEND_FILTER -> {
                    var section = ConfideHomeFilterSection(context, view)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
                //最近倾诉
                IConfideHomeConfig.TYPE_RECENTLY_CONFIDED -> {
                    var section = ConfideHomeRecentConfideSection(context, mConfideEvent)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
                //为你推荐
                IConfideHomeConfig.TYPE_RECOMMEND -> {
                    var section = ConfideRecommendSection(context, view, mConfideEvent)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
                //听声寻人
                IConfideHomeConfig.TYPE_SOUND -> {
                    var section = ConfideHomeListenAndFoundSection(context, view, mConfideEvent)
                    section.setData(resultBean)
                    mConfideAdapter?.addSection(section)
                }
            }
        }

        /**
         * 更新section适配器数据(用于点击某个模块的播放或暂停按钮,重置了各模块的播放状态字段)
         * @param list 数据集合
         * @param mConfideAdapter section适配器
         */
        fun updateSection(list: List<ConfideHomeDataBean>, mConfideAdapter: SectionAdapter) {
            //banner 数据bean
            var bannerData: ConfideHomeDataBean? = null
            //分类 数据bean
            var categoryData: ConfideHomeDataBean? = null
            //最近倾诉 数据bean
            var recentData: ConfideHomeDataBean? = null
            //为你推荐筛选模块 数据bean
            var recommendFilterData: ConfideHomeDataBean? = null
            //为你推荐 数据bean
            var recommendData: ConfideHomeDataBean? = null
            //听声寻人 数据bean
            var listenAndFoundData: ConfideHomeDataBean? = null
            //最佳倾听榜单 数据bean
            var recommendExpertData: ConfideHomeDataBean? = null

            for (resultBean in list) {
                when (resultBean.type) {
                    //banner
                    IConfideHomeConfig.TYPE_BANNER -> {
                        bannerData = resultBean
                    }
                    //最近倾诉
                    IConfideHomeConfig.TYPE_RECENTLY_CONFIDED -> {
                        recentData = resultBean
                    }
                    //分类测评
                    IConfideHomeConfig.TYPE_CATEGORY -> {
                        categoryData = resultBean
                    }
                    //为你推荐筛选模块数据
                    IConfideHomeConfig.TYPE_RECOMMEND_FILTER -> {
                        recommendFilterData = resultBean
                    }
                    //为你推荐
                    IConfideHomeConfig.TYPE_RECOMMEND -> {
                        recommendData = resultBean
                    }
                    //听声寻人
                    IConfideHomeConfig.TYPE_SOUND -> {
                        listenAndFoundData = resultBean
                    }
                    //最佳倾听榜单
                    IConfideHomeConfig.TYPE_CONSULTANT -> {
                        recommendExpertData = resultBean
                    }
                }
            }

            for (section in mConfideAdapter.getmSections()) {
                when (section) {
                    is ConfideHomeBannerSection -> {
                        //banner
                        section.setData(bannerData!!)
                    }
                    is ConfideHomeRecentConfideSection -> {
                        //最近倾诉
                        section.setData(recentData!!)
                    }
                    is ConfideHomeCategorySection -> {
                        //分类倾诉
                        section.setData(categoryData!!)
                    }
                    is ConfideHomeFilterSection -> {
                        //为你推荐筛选模块
                        section.setData(recommendFilterData!!)
                    }
                    is ConfideRecommendSection -> {
                        //为你推荐
                        section.setData(recommendData!!)
                    }
                    is ConfideHomeListenAndFoundSection -> {
                        //听声寻人
                        section.setData(listenAndFoundData!!)
                    }
                    is ConfideHomeRecommendExpertSection -> {
                        //最佳倾听榜单
                        section.setData(recommendExpertData!!)
                    }
                }
            }
        }

        /**
         * 移除为你推荐和听声寻人section
         */
        fun removeRecommendAndSoundSection(mConfideAdapter: SectionAdapter) {
            for (index in (0..(mConfideAdapter.getmSections().size - 1)).reversed()) {
                if (mConfideAdapter.getmSections()[index] is ConfideRecommendSection) {
                    //移除为你推荐section
                    mConfideAdapter.getmSections().removeAt(index)
                } else if (mConfideAdapter.getmSections()[index] is ConfideHomeListenAndFoundSection) {
                    //移除听声寻人section
                    mConfideAdapter.getmSections().removeAt(index)
                }
            }
        }

        /**
         * 同步筛选栏样式状态(因为筛选栏有两个 一个是列表中的,一个是顶部隐藏的)
         */
        fun synchroStyle(context: Context, type: Int, status: Int, filterView: ConfideHomeFilterView, mConfideAdapter: ConfideHomeAdapter) {
            //设置悬浮隐藏的筛选栏样式
            var view = filterView.getTextViewByType(type)
            if (null != view) {
                updateOthersTextStyle(context, view, status)
            }
            //设置列表中的筛选栏样式
            if (null != mConfideAdapter.getFilterViewHolder() && null != mConfideAdapter.getFilterViewHolder()!!.filterView) {
                var list_filterView = mConfideAdapter.getFilterViewHolder()!!.filterView.getTextViewByType(type)
                if (null != list_filterView) {
                    updateOthersTextStyle(context, list_filterView, status)
                }
            }
        }

        /**
         * 同步筛选栏样式状态(因为筛选栏有两个 一个是列表中的,一个是顶部隐藏的)
         */
        fun synchroTextColor(context: Context, type: Int, status: Int, filterView: ConfideHomeFilterView, mConfideAdapter: ConfideHomeAdapter) {
            //设置悬浮隐藏的筛选栏样式
            var view = filterView.getTextViewByType(type)
            if (null != view) {
                updateOthersTextColor(context, view, status)
            }
            //设置列表中的筛选栏样式
            //为你推荐筛选模块
            if (null != mConfideAdapter.getFilterViewHolder() && null != mConfideAdapter.getFilterViewHolder()!!.filterView) {
                var list_filterView = mConfideAdapter.getFilterViewHolder()!!.filterView.getTextViewByType(type)
                if (null != list_filterView) {
                    updateOthersTextColor(context, list_filterView, status)
                }
            }
        }

        /**
         * 同步筛选栏样式状态(因为筛选栏有两个 一个是列表中的,一个是顶部隐藏的)
         */
        fun synchroTextDrawable(mContext: Context, type: Int, status: Int, filterView: ConfideHomeFilterView, mConfideAdapter: ConfideHomeAdapter) {
            //设置悬浮隐藏的筛选栏样式
            var view = filterView.getTextViewByType(type)
            if (null != view) {
                updateOthersTextDrawable(mContext, view, status)
            }
            //设置列表中的筛选栏样式
            //为你推荐筛选模块
            if (null != mConfideAdapter.getFilterViewHolder() && null != mConfideAdapter.getFilterViewHolder()!!.filterView) {
                var list_filterView = mConfideAdapter.getFilterViewHolder()!!.filterView.getTextViewByType(type)
                if (null != list_filterView) {
                    updateOthersTextDrawable(mContext, list_filterView, status)
                }
            }
        }

        /**
         * 获取滑动的距离
         */
        fun getScollYDistance(recyclerview: RecyclerView): Int {
            if (null == recyclerview) {
                return 0
            }
            val layoutManager = recyclerview.layoutManager as LinearLayoutManager
            val position = layoutManager.findFirstVisibleItemPosition()
            val firstVisiableChildView = layoutManager.findViewByPosition(position)
            val itemHeight = firstVisiableChildView.height
            var yDistance = position * itemHeight - firstVisiableChildView.top
            if (yDistance <= 50 && position > 1) {
                //position滑动到2和3之间的时候 滑动距离 会变成 小于10的距离
                //先这样解决吧
                return 200
            }
            return yDistance
        }

        /**
         * 跳转个人中心
         */
        fun buildJumpMine(context: Context) {
            val intent = Intent()
            intent.putExtra(MainUtils.ACTION_TAG, MainUtils.JUMP_MAIN_TAB_CHANGE)
            intent.putExtra(MainUtils.MAIN_TAB_INDEX, 4)
            intent.setClassName(context, "com.cxzapp.yidianling.MainActivity")
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            context.startActivity(intent)
        }

        /**
         * 根据点击播放的位置,重置所有数据播放状态
         * @param cacheList 缓存数据
         * @param type 点击的数据类型
         * @param index 一级数据索引
         * @param recommendId 为你推荐区域Id 用于区分播放的区域 因为为你推荐是多个section
         */
        fun changeCacheDataPlay(cacheList: MutableList<ConfideHomeDataBean>?, type: Int?, index: Int?, recommendId: Int?) {
            if (null == cacheList) {
                return
            }
            for ((itemIndex, item) in cacheList!!.withIndex()) {
                if (null == item) {
                    break
                }
                //循环查找点击的类型
                if (item.type == type) {
                    if (type == IConfideHomeConfig.TYPE_RECOMMEND && null != item.body && !item.body.isEmpty()) {
                        // 为你推荐
                        // 当ID匹配的时候 在去查找对应的索引位置
                        if (item.recommendId == recommendId) {
                            item.body[0].confideIsPlay = itemIndex == index
                        } else {
                            item.body[0].confideIsPlay = false
                        }
                    } else {
                        for ((i, bodyItem) in item.body!!.withIndex()) {
                            bodyItem.confideIsPlay = index == i
                        }
                    }
                } else {
                    for (bodyItem in item.body!!) {
                        bodyItem.confideIsPlay = false
                    }
                }
            }
        }

        /**
         * 更新播放状态
         */
        fun updateFMStatu(mPlayerFloatView: ConfidePlayerFloatView, isPlaying: Boolean) {
            if (null == mPlayerFloatView) {
                return
            }
            if (isPlaying) {
                mPlayerFloatView.visibility = View.VISIBLE
            } else {
                mPlayerFloatView.visibility = View.GONE
            }
            mPlayerFloatView.updatePlayState(isPlaying)
        }

        //更改筛选选项的按钮 文字颜色和图标
        private fun updateOthersTextStyle(mContext: Context, tv: AppCompatTextView, status: Int) {
            LogUtil.e("http-----------------updateOthersTextStyle")
            when (status) {
                IConfideHomeConfig.FILTER_STATUS_NORMAL -> {
                    tv.setTextColor(ContextCompat.getColor(mContext, R.color._6))
                    tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.platform_ic_arrow_drop_down_grey_500_18dp, 0)
                }
                IConfideHomeConfig.FILTER_STATUS_FILTERED, IConfideHomeConfig.FILTER_STATUS_OPEN -> {
                    tv.setTextColor(ContextCompat.getColor(mContext, R.color.confide_main_theme))
                    tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.confide_ic_arrow_drop_down_green_18dp, 0)
                }
            }
        }

        //设置筛选选项的按钮文字颜色
        private fun updateOthersTextColor(mContext: Context, tv: AppCompatTextView, status: Int) {
            LogUtil.e("http-----------------updateOthersTextColor")
            when (status) {
                IConfideHomeConfig.FILTER_STATUS_NORMAL -> {
                    tv.setTextColor(ContextCompat.getColor(mContext, R.color._6))
                }
                IConfideHomeConfig.FILTER_STATUS_FILTERED, IConfideHomeConfig.FILTER_STATUS_OPEN -> {
                    tv.setTextColor(ContextCompat.getColor(mContext, R.color.confide_main_theme))
                }
            }
            tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.platform_ic_arrow_drop_down_grey_500_18dp, 0)
        }

        //更改筛选选项的按钮 图标
        private fun updateOthersTextDrawable(mContext: Context, tv: AppCompatTextView, status: Int) {
            when (status) {
                IConfideHomeConfig.FILTER_STATUS_NORMAL -> {
                    tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.platform_ic_arrow_drop_down_grey_500_18dp, 0)
                }
                IConfideHomeConfig.FILTER_STATUS_FILTERED, IConfideHomeConfig.FILTER_STATUS_OPEN -> {
                    tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.confide_ic_arrow_drop_down_green_18dp, 0)
                }
            }
        }

        /**
         * 启动 播放动画
         */
        fun startPlayAnim(context: Context, imageView: ImageView) {
            var animation = AnimationUtils.loadAnimation(context, R.anim.confide_play_anim)
            var lin = LinearInterpolator()//设置动画匀速运动
            animation.interpolator = lin
            imageView.startAnimation(animation)
        }

        /**
         * 停止 播放动画
         */
        fun stopPlayAnim(imageView: ImageView) {
            imageView.clearAnimation()
        }

        /**
         * 构建为你推荐接口入参
         * @param  allFiltersBean          筛选参数缓存
         * @return ConfideRecommendParam  为你推荐参数bean
         */
        fun createParam(allFiltersBean: ConfideHomeAllFiltersBean): ConfideRecommendParam {
            var param = ConfideRecommendParam.Builder()
            param.notInUid = allFiltersBean.notInUid
            //页码
            if (-1 != allFiltersBean.page) {
                param.page(allFiltersBean.page)
            }
            //综合排序
            if (null != allFiltersBean.selectSort && !TextUtils.isEmpty(allFiltersBean.selectSort!!.id) && "-1" != allFiltersBean.selectSort!!.id) {
                param.sortType(allFiltersBean.selectSort!!.id!!)
            }
            //性别
            if (null != allFiltersBean.selectSex && !TextUtils.isEmpty(allFiltersBean.selectSex!!.id) && "-1" != allFiltersBean.selectSex!!.id) {
                param.sexType(allFiltersBean.selectSex!!.id!!)
            }
            //年龄
            if (null != allFiltersBean.selectAgeData && !allFiltersBean.selectAgeData.isEmpty()) {
                param.ageType(allFiltersBean.selectAgeData.map { it.id }.joinToString("-"))
            }
            //擅长方向
            if (null != allFiltersBean.selectGoodData && !allFiltersBean.selectGoodData.isEmpty()) {
                param.goodType(allFiltersBean.selectGoodData.map { it.id }.joinToString("-"))
            }
            return param.build()
        }
    }
}