package com.bonait.bnframework.modules.home.adapter;

import android.view.View;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: liup
 * @description: adapter基类
 * @date: 2024/6/6 9:02.
 */
public abstract class BaseAdapter<T, VH extends RecyclerView.ViewHolder>
        extends RecyclerView.Adapter<VH> {
    /**
     * 数据
     */
    protected List<T> mData;
    /**
     * 当前位置
     */
    protected int mCurrentPosition = -1;

    /**
     * 不初始化数据
     */
    public BaseAdapter() {
        this(null);
    }

    /**
     * 初始化数据
     *
     * @param data 数据
     */
    public BaseAdapter(List<T> data) {
        super();
        mData = data;
    }

    /**
     * 获取当前位置
     *
     * @return 当前位置
     */
    public int getCurrentPosition() {
        return mCurrentPosition;
    }

    /**
     * 设置当前位置
     *
     * @param currentPosition 当前位置
     */
    public void setCurrentPosition(int currentPosition) {
        mCurrentPosition = currentPosition;
    }

    /**
     * 获取数据
     *
     * @return 数据
     */
    public List<T> getData() {
        if (mData == null) {
            mData = new ArrayList<>();
        }
        return mData;
    }

    /**
     * 设置数据
     *
     * @param data 数据
     */
    public void setNewData(List<T> data) {
        mData = data == null ? new ArrayList<>() : data;
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     *
     * @param newData 新数据
     */
    public void addData(List<T> newData) {
        mData.addAll(newData);
        notifyItemRangeInserted(mData.size() - newData.size(), newData.size());
    }

    /**
     * 添加数据
     *
     * @param newData 新数据
     */
    public void addData(T newData) {
        mData.add(newData);
        notifyItemRangeInserted(mData.size() - 1, 1);
    }

    /**
     * 更新数据
     *
     * @param data 数据
     */
    public void updateData(List<T> data) {
        if (data != null) {
            int size = data.size();
            int mSize = mData.size();
            if (mSize >= size) {
                if (size > 0) {
                    for (int i = 0; i < size; i++) {
                        mData.set(i, data.get(i));
                    }
                    notifyItemRangeChanged(0, size);
                }
                if (mSize > size) {
                    for (int i = 0; i < mSize - size; i++) {
                        mData.remove(mData.size() - 1);
                    }
                    notifyItemRangeRemoved(size, mSize - size);
                }
            } else {
                for (int i = 0; i < mSize; i++) {
                    mData.set(i, data.get(i));
                }
                notifyItemRangeChanged(0, mSize);
                for (int i = mSize; i < size; i++) {
                    mData.add(data.get(i));
                }
                notifyItemRangeInserted(mSize, size - mSize);
            }
        }
    }

    /**
     * 替换数据
     *
     * @param data 数据
     */
    public void replaceData(List<T> data) {
        if (data != mData) {
            mCurrentPosition = 0;
            if(mData==null){
                mData=data;
            }else {
                mData.clear();
                mData.addAll(data);
                notifyDataSetChanged();
            }
        }
    }

    /**
     * 清空数据
     */
    public void clearData() {
        if(mData!=null) {
            mCurrentPosition = 0;
            mData.clear();
            notifyDataSetChanged();
        }
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        if (mData == null || mData.isEmpty()) {
            return 0;
        }
        return mData.size();
    }

    /**
     * 当项被点击
     *
     * @param v        视图
     * @param position 位置
     */
    protected abstract void onItemClick(View v, int position);
}