package com.tumblr.example.binderlist;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Toast;
import com.tumblr.example.PrimitiveAdapter;
import com.tumblr.example.binder.ColorNameToastBinder;
import com.tumblr.example.binder.TextPrimitiveBinder;
import com.tumblr.example.dagger.PerActivity;
import com.tumblr.example.model.ColorNamePrimitive;
import com.tumblr.example.viewholder.PrimitiveViewHolder;
import com.tumblr.graywater.GraywaterAdapter;

import javax.inject.Inject;
import javax.inject.Provider;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ericleong on 3/28/16.
 */
@PerActivity
public class ColorNamePrimitiveItemBinder
		implements GraywaterAdapter.ItemBinder<ColorNamePrimitive, PrimitiveViewHolder,
		GraywaterAdapter.Binder<ColorNamePrimitive, PrimitiveViewHolder, ? extends PrimitiveViewHolder>>,
		GraywaterAdapter.ActionListener<ColorNamePrimitive, PrimitiveViewHolder, PrimitiveViewHolder> {

	private final Provider<TextPrimitiveBinder<ColorNamePrimitive>> mColorNameTextBinder;
	private final Provider<ColorNameToastBinder> mColorNameToastBinder;

	private final Provider<PrimitiveAdapter> mAdapter;

	@Inject
	public ColorNamePrimitiveItemBinder(final Provider<PrimitiveAdapter> adapter,
	                                    final Provider<TextPrimitiveBinder<ColorNamePrimitive>> colorNameTextBinder,
	                                    final Provider<ColorNameToastBinder> colorNameToastBinder) {
		mColorNameTextBinder = colorNameTextBinder;
		mColorNameToastBinder = colorNameToastBinder;
		mAdapter = adapter;
	}

	@NonNull
	@Override
	public List<Provider<? extends GraywaterAdapter.Binder<ColorNamePrimitive, PrimitiveViewHolder, ? extends PrimitiveViewHolder>>>
	getBinderList(@NonNull final ColorNamePrimitive model, final int position) {
		return new ArrayList<Provider<
				? extends GraywaterAdapter.Binder<ColorNamePrimitive, PrimitiveViewHolder, ? extends PrimitiveViewHolder>>>() {{
			add(mColorNameTextBinder);
			add(mColorNameToastBinder);
		}};
	}

	@Override
	public void act(@NonNull final ColorNamePrimitive model,
	                @NonNull final PrimitiveViewHolder holder,
	                @NonNull final View v,
	                @NonNull final List<Provider<GraywaterAdapter.Binder<
			                ? super ColorNamePrimitive, PrimitiveViewHolder, ? extends PrimitiveViewHolder>>> binderList,
	                final int binderIndex,
	                @Nullable final Object obj) {
		Toast.makeText(v.getContext(), model.getString(), Toast.LENGTH_SHORT).show();

		final PrimitiveAdapter adapter = mAdapter.get();

		adapter.add(adapter.getItemPosition(holder.getAdapterPosition()) + 1,
				new ColorNamePrimitive(model.getColor(), model.getString() + "+"), true);
	}
}