package co.smartreceipts.android.model.factory;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.common.base.Preconditions;
import co.smartreceipts.android.model.Column;
import co.smartreceipts.android.model.ColumnDefinitions;
import co.smartreceipts.android.model.UnknownColumnResolutionStrategory;
import co.smartreceipts.android.model.impl.columns.resolution.ConstantColumnUnknownColumnResolutionStrategory;
import co.smartreceipts.android.sync.model.SyncState;
import co.smartreceipts.android.sync.model.impl.DefaultSyncState;
/**
* A {@link co.smartreceipts.android.model.Column} {@link BuilderFactory}
* implementation, which will be used to generate instances of {@link co.smartreceipts.android.model.Column} objects
*/
public final class ColumnBuilderFactory<T> implements BuilderFactory<Column<T>> {
private final ColumnDefinitions<T> mColumnDefinitions;
private final UnknownColumnResolutionStrategory<T> mUnknownColumnResolutionStrategory;
private int mId;
private String mColumnName;
private SyncState mSyncState;
public ColumnBuilderFactory(@NonNull ColumnDefinitions<T> columnDefinitions) {
this(columnDefinitions, new ConstantColumnUnknownColumnResolutionStrategory<T>());
}
public ColumnBuilderFactory(@NonNull ColumnDefinitions<T> columnDefinitions, @NonNull UnknownColumnResolutionStrategory<T> unknownColumnResolutionStrategory) {
mColumnDefinitions = columnDefinitions;
mUnknownColumnResolutionStrategory = unknownColumnResolutionStrategory;
mId = Column.UNKNOWN_ID;
mColumnName = "";
mSyncState = new DefaultSyncState();
}
public ColumnBuilderFactory<T> setColumnId(int id) {
mId = id;
return this;
}
public ColumnBuilderFactory<T> setColumnName(@Nullable Column<T> column) {
mColumnName = (column != null) ? column.getName() : "";
return this;
}
public ColumnBuilderFactory<T> setColumnName(@Nullable String name) {
mColumnName = (name != null) ? name : "";
return this;
}
public ColumnBuilderFactory<T> setSyncState(@NonNull SyncState syncState) {
mSyncState = Preconditions.checkNotNull(syncState);
return this;
}
@NonNull
@Override
public Column<T> build() {
final Column<T> column = mColumnDefinitions.getColumn(mId, mColumnName, mSyncState);
return (column != null) ? column : mUnknownColumnResolutionStrategory.resolve(mId, mColumnName);
}
}