package com.yidianling.course.courseSearch

import android.content.Context
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.yidianling.course.R

/**
 * @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
 * @描述: 课程搜索页面列表适配器包装类,包装了底部item(加载中和到达底部item的变化,还有上拉到底部的监听)
 * @Copyright Copyright (c) 2019
 * @Company 壹点灵
 * @date 2019/01/07
 */
class CourseSearchAdapterWrapper(
    context: Context,
    val mAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>,
    val initialPageCount: Int,
    val recycler: RecyclerView
)
    : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var mInflater: LayoutInflater? = null
    private var footerType = TYPE_FOOTER_LOADING //默认为正在加载
    private var lastVisibleItem:Int = 0
    private var onLoadMoreListener: OnLoadMoreListener? = null
    private var isLoading:Boolean? = null

    init {
        isLoading = true
        mInflater = LayoutInflater.from(context)
    }

    companion object {
        const val TYPE_FOOTER_LOADING = 100000001 //底部正在加载view
        const val TYPE_FOOTER_NOMORE = 100000002 //底部无更多数据view
    }

    /**
     * 加1是因为包装类为自定义的adapter增加了一个footer
     */
    override fun getItemCount(): Int  = mAdapter.itemCount + 1

    override fun getItemViewType(position: Int): Int {
        //如果首次加载的数据少于 initialPageCount 行,则表明没有更多数据了,直接返回TYPE_FOOTER_NOMORE类型footer
        if (position == mAdapter.itemCount && mAdapter.itemCount < initialPageCount) return TYPE_FOOTER_NOMORE
        return when (position < mAdapter.itemCount) {
            true -> mAdapter.getItemViewType(position)
            false -> footerType
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        var view:View? = null
        return when (viewType) {
            TYPE_FOOTER_LOADING -> {
                FooterHolder(mInflater!!.inflate(R.layout.course_footer, parent, false), TYPE_FOOTER_LOADING)
            }
            TYPE_FOOTER_NOMORE -> {
                FooterHolder(mInflater!!.inflate(R.layout.course_footer, parent, false), TYPE_FOOTER_NOMORE)
            }
            else -> {
                mAdapter.onCreateViewHolder(parent, viewType)
            }
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is FooterHolder -> { }
            else -> {
                mAdapter.onBindViewHolder(holder, position)
            }
        }
    }

    //需要加载更多数据时调用
    fun insertData() {
        footerType = TYPE_FOOTER_LOADING
        notifyDataSetChanged()
        isLoading = false
    }

    //没有更多数据时候调用
    fun noMoreData() {
        footerType = TYPE_FOOTER_NOMORE
        notifyItemChanged(mAdapter.itemCount)
        isLoading = false
    }

    fun setOnScrollerListener() {
        recycler.addOnScrollListener(object: RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                val layoutManager = recyclerView?.layoutManager

                when (layoutManager) {
                    is LinearLayoutManager -> {
                        lastVisibleItem = layoutManager.findLastVisibleItemPosition()
                    }
                //这里现在只写了LinearLayoutManager的代码,后续补充
                }
            }
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE //停止滚动
                        && footerType == TYPE_FOOTER_LOADING  //footer状态为加载更多
                        && lastVisibleItem >= mAdapter.itemCount //最后一个显示的item序号大于适配器item数量,即显示了footer
                        && isLoading == false) //当前没有在onLoadMore状态
                {
                    isLoading = true
                    onLoadMoreListener?.onLoadMore()
                }
            }
        })
    }

    fun setOnLoadMoreListener (listener: OnLoadMoreListener): CourseSearchAdapterWrapper {
        this.onLoadMoreListener = listener
        //设置滑动监听
        setOnScrollerListener()
        return this
    }

    interface OnLoadMoreListener {
        fun onLoadMore() //加载更多
    }

    /**
     * 自定义的底部item,后续会继续暴露方法给外部动态设置加载更多时候的gif图
     */
    class FooterHolder(view: View, type:Int): RecyclerView.ViewHolder(view) {
        var txt: TextView? = null

        init {
            txt = view.findViewById(R.id.footer_txt)
            when (type) {
                TYPE_FOOTER_LOADING -> {
                    txt!!.text = "正在加载..."
                }
                TYPE_FOOTER_NOMORE -> {
                    txt!!.text = "已经到达底部"
                }
            }
        }
    }

}