package com.github.vivchar.example.pages.github.items.list;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.ViewGroup;

import com.github.vivchar.example.widgets.BetweenSpacesItemDecoration;
import com.github.vivchar.example.R;
import com.github.vivchar.example.widgets.NestedAdapter;
import com.github.vivchar.rendererrecyclerviewadapter.CompositeViewRenderer;
import com.github.vivchar.rendererrecyclerviewadapter.DefaultDiffCallback;
import com.github.vivchar.rendererrecyclerviewadapter.RendererRecyclerViewAdapter;
import com.github.vivchar.rendererrecyclerviewadapter.ViewState;

import java.util.Collections;
import java.util.List;

/**
 * Created by Vivchar Vitaly on 8/24/17.
 */

public class RecyclerViewRenderer extends CompositeViewRenderer<RecyclerViewModel, RecyclerViewHolder> {

	private static final String TAG = RecyclerViewRenderer.class.getSimpleName();

	public RecyclerViewRenderer() {
		super(RecyclerViewModel.class);
	}

	@Override
	public void rebindView(@NonNull final RecyclerViewModel model, @NonNull final RecyclerViewHolder holder, @NonNull final List<Object> payloads) {
		Log.d(TAG, "rebindView " + model.toString() + ", payload: " + payloads.toString());
		holder.getAdapter().enableDiffUtil();
		holder.getAdapter().setItems(model.getItems());
	}

	@Override
	public void bindView(@NonNull final RecyclerViewModel model, @NonNull final RecyclerViewHolder holder) {
		Log.d(TAG, "bindView " + model.toString());
		holder.getAdapter().disableDiffUtil();
		holder.getAdapter().setItems(model.getItems());
		holder.getAdapter().notifyDataSetChanged();
	}

	@NonNull
	@Override
	public RecyclerViewHolder createCompositeViewHolder(@Nullable final ViewGroup parent) {
		return new RecyclerViewHolder(inflate(R.layout.item_composite, parent));
	}

	@Nullable
	@Override
	public ViewState createViewState(@NonNull final RecyclerViewHolder holder) {
		return new RecyclerViewState(holder);
	}

	@Override
	public int createViewStateID(@NonNull final RecyclerViewModel model) {
		return model.getID();
	}

	@NonNull
	@Override
	protected RendererRecyclerViewAdapter createAdapter() {
		final NestedAdapter nestedAdapter = new NestedAdapter();
		nestedAdapter.setDiffCallback(new DefaultDiffCallback());
		return nestedAdapter;
	}

	@NonNull
	@Override
	protected List<? extends RecyclerView.ItemDecoration> createItemDecorations() {
		return Collections.singletonList(new BetweenSpacesItemDecoration(0, 10));
	}
}