package com.ydl.ydlcommon.adapter

import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.ydl.ydlcommon.view.BaseViewHolder


/**
 * 支持添加head 和 foot的adapter
 *
 * 子类需复写bindData() 设置显示数据
 *
 * 设置加载更多回调监听
 *
 * Created by harvie on 2017/6/27 0027.
 */
class CommonRecyclerAdapter<T>(recyclerView: RecyclerView?, resLayout: Int) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    var datas: ArrayList<T> = ArrayList()

    var layout : Int = resLayout

    var headView: View ?= null

    var footView: View ?=null

    var recyView : RecyclerView? = recyclerView

    private var visibleItemCount : Int = 0
    private var totalItemCount :Int = 0
    private var lastVisibleItem : Int =0
    /**
     * 当前滑动的状态
     */
    private var currentScrollState = 0

    private var layoutManagerType : LayoutManagerType =
        LayoutManagerType.LinearLayout


    //绑定数据的回调接口
    var callback : BindDataCallback<T>?=null

    //加载更多回调接口
    var loadmoreListener : OnLoadMoreLIstener? = null

    private fun setOnScrollListener(){

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

                if (layoutManager is LinearLayoutManager) {
                    layoutManagerType =
                        LayoutManagerType.LinearLayout
                } else if (layoutManager is GridLayoutManager) {
                    layoutManagerType =
                        LayoutManagerType.GridLayout
                } else if (layoutManager is StaggeredGridLayoutManager) {
                    layoutManagerType =
                        LayoutManagerType.StaggeredGridLayout
                } else {
                    throw RuntimeException(
                            "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager")
                }

                when (layoutManagerType) {
                    LayoutManagerType.LinearLayout -> lastVisibleItem = (layoutManager as LinearLayoutManager).findLastVisibleItemPosition()
                    LayoutManagerType.GridLayout -> lastVisibleItem = (layoutManager as GridLayoutManager).findLastVisibleItemPosition()
                    else -> {
                    }
                }
            }

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                visibleItemCount = recyclerView.childCount
                if (recyclerView.layoutManager is LinearLayoutManager){
                    val laymanager : LinearLayoutManager = recyclerView.layoutManager as LinearLayoutManager

                    totalItemCount = laymanager.itemCount
                    lastVisibleItem = laymanager.findLastVisibleItemPosition()

                    currentScrollState = newState
                    if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem >= totalItemCount - 1)) {
                        //加载更多
                        loadmoreListener?.onLoadMore()
                    }
                }
            }
        })
    }

    //设置加载更多监听
    fun setOnLoadMoreListener(loadmoreListener : OnLoadMoreLIstener) : CommonRecyclerAdapter<T> {
        this.loadmoreListener = loadmoreListener
        //设置滑动监听
        setOnScrollListener()
        return this
    }

    //update data
    fun update(datas1: List<T>?){
        if (datas1!=null){
            this.datas.clear()
            this.datas.addAll(datas1)
            notifyDataSetChanged()
        }
    }

    //追加数据
    fun addDatas(datas1: List<T>){
        this.datas.addAll(datas1)
        notifyDataSetChanged()
    }

    //设置headView
    fun addHeadView(headView: View?) {
        this.headView = headView
    }

    //添加item到列表最后
    fun addItem(t :T){
        if (t==null)return
        datas.add(t)
        notifyDataSetChanged()
    }

    //添加item到制定位置
    fun addItem(index : Int,t:T){
        if (t==null)return
        datas.add(index,t)
        notifyDataSetChanged()
    }

    //设置footView
    fun addFootView(footView: View?) {
        this.footView = footView
    }

    //设置绑定数据回调接口
    fun setBindDataCallback(callback: BindDataCallback<T>) : CommonRecyclerAdapter<T> {
        this.callback = callback
        return this
    }

    val headViewCount: Int
        get() = if (headView == null) 0 else 1

    val footViewCount: Int
        get() = if (footView == null) 0 else 1

    override fun getItemCount(): Int {
        return datas.size + headViewCount + footViewCount
    }

    override fun getItemViewType(position: Int): Int {
        if (position < headViewCount) return HEAD
        if (position >= datas.size + headViewCount) return FOOT
        return NORMAL
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        if (viewType == HEAD) return BaseViewHolder(
            headView
        )
        if (viewType == FOOT) return BaseViewHolder(
            footView
        )
        val view = LayoutInflater.from(viewGroup.context).inflate(layout, null)
        return BaseViewHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if (getItemViewType(position) == HEAD) return
        if (getItemViewType(position) == FOOT) return
        //绑定数据
        callback?.bindDatabindData(holder as BaseViewHolder,datas[position-headViewCount],position-headViewCount)
    }

    companion object {
        val HEAD = 1
        val NORMAL = 2
        val FOOT = 3
    }

    interface BindDataCallback<T>{
        //绑定数据回调  需要子类设置此回调
        fun bindDatabindData(holder : BaseViewHolder, t : T, position: Int)
    }
    //加载更多监听
    interface OnLoadMoreLIstener{
        fun onLoadMore()
    }

    enum class LayoutManagerType {
        LinearLayout,
        StaggeredGridLayout,
        GridLayout
    }
}