package io.instacount.appengine.counter.data.ofy;

import java.lang.reflect.Field;

import io.instacount.appengine.counter.data.CounterGroupData;
import org.apache.commons.lang3.StringUtils;

import com.google.common.base.Preconditions;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.condition.InitializeIf;
import com.googlecode.objectify.condition.PojoIf;
import io.instacount.appengine.counter.data.CounterData;

/**
 * An extension of {@link PojoIf} that decides if a particular property of a {@link CounterData} should be indexed in
 * the Appengine datastore.
 */
public class IfCounterDataIndexable extends PojoIf<CounterData> implements InitializeIf
{
	private Field field;

	@Override
	public void init(final ObjectifyFactory fact, final Field field)
	{
		Preconditions.checkNotNull(fact);
		Preconditions.checkNotNull(field);

		// Store off the field for use in the matches method.
		this.field = field;
	}

	@Override
	public boolean matchesPojo(final CounterData counterData)
	{
		if (counterData == null)
		{
			return false;
		}
		else
		{
			final String fieldName = field.getName();
			if (CounterData.class.equals(field.getDeclaringClass())
				|| CounterGroupData.class.equals(field.getDeclaringClass()))
			{
				// 'counterData.indexes' object is guaranteed to be non-null via Precondition checks.

				// Field found in CounterData.class
				if (StringUtils.equals(fieldName, "numShards"))
				{
					return counterData.getIndexes().isNumShardsIndexable();
				}
				// Field found in CounterData.class
				else if (StringUtils.equals(fieldName, "counterStatus"))
				{
					return counterData.getIndexes().isCounterStatusIndexable();
				}
				// Field found in CounterData.class
				else if (StringUtils.equals(fieldName, "description"))
				{
					return counterData.getIndexes().isDescriptionIndexable();
				}
				// Field found in CounterGroupData.class
				else if (StringUtils.equals(fieldName, "eventuallyConsistentCount"))
				{
					return counterData.getIndexes().isCountIndexable();
				}
				else if (StringUtils.equals(fieldName, "creationDateTime"))
				{
					return counterData.getIndexes().isCreationDateTimeIndexable();
				}
				else if (StringUtils.equals(fieldName, "updatedDateTime"))
				{
					return counterData.getIndexes().isUpdateDateTimeIndexable();
				}
			}

			return false;
		}
	}
}