package co.smartreceipts.android.model.factory; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import com.google.common.base.Preconditions; import java.math.BigDecimal; import java.sql.Date; import java.util.TimeZone; import co.smartreceipts.android.model.Distance; import co.smartreceipts.android.model.PriceCurrency; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.model.impl.ImmutableDistanceImpl; import co.smartreceipts.android.sync.model.SyncState; import co.smartreceipts.android.sync.model.impl.DefaultSyncState; /** * A {@link co.smartreceipts.android.model.Distance} {@link BuilderFactory} * implementation, which will be used to generate instances of {@link co.smartreceipts.android.model.Distance} objects */ public final class DistanceBuilderFactory implements BuilderFactory<Distance> { private int _id; private Trip _trip; private String _location; private BigDecimal _distance; private Date _date; private TimeZone _timezone; private BigDecimal _rate; private PriceCurrency _currency; private String _comment; private SyncState _syncState; public DistanceBuilderFactory() { this(MISSING_ID); } public DistanceBuilderFactory(int id) { _id = id; _location = ""; _distance = new BigDecimal(0); _date = new Date(System.currentTimeMillis()); _timezone = TimeZone.getDefault(); _rate = new BigDecimal(0); _comment = ""; _syncState = new DefaultSyncState(); } public DistanceBuilderFactory(@NonNull Distance distance) { this(distance.getId(), distance); } public DistanceBuilderFactory(int id, @NonNull Distance distance) { _id = id; _trip = distance.getTrip(); _location = distance.getLocation(); _distance = distance.getDistance(); _date = distance.getDate(); _timezone = distance.getTimeZone(); _rate = distance.getRate(); _currency = distance.getPrice().getCurrency(); _comment = distance.getComment(); _syncState = distance.getSyncState(); } public DistanceBuilderFactory setTrip(final Trip trip) { _trip = trip; return this; } public DistanceBuilderFactory setLocation(String location) { _location = location; return this; } public DistanceBuilderFactory setDistance(BigDecimal distance) { _distance = distance; return this; } public DistanceBuilderFactory setDistance(double distance) { _distance = new BigDecimal(distance); return this; } public DistanceBuilderFactory setDate(Date date) { _date = date; return this; } public DistanceBuilderFactory setDate(long date) { _date = new Date(date); return this; } public DistanceBuilderFactory setTimezone(@Nullable String timezone) { // Our distance table doesn't have a default timezone, so protect for nulls if (timezone != null) { _timezone = TimeZone.getTimeZone(timezone); } return this; } public DistanceBuilderFactory setTimezone(TimeZone timezone) { _timezone = timezone; return this; } public DistanceBuilderFactory setRate(BigDecimal rate) { _rate = rate; return this; } public DistanceBuilderFactory setRate(double rate) { _rate = new BigDecimal(rate); return this; } public DistanceBuilderFactory setCurrency(PriceCurrency currency) { _currency = currency; return this; } public DistanceBuilderFactory setCurrency(@NonNull String currencyCode) { if (TextUtils.isEmpty(currencyCode)) { throw new IllegalArgumentException("The currency code cannot be null or empty"); } _currency = PriceCurrency.getInstance(currencyCode); return this; } public DistanceBuilderFactory setComment(String comment) { _comment = comment; return this; } public DistanceBuilderFactory setSyncState(@NonNull SyncState syncState) { _syncState = Preconditions.checkNotNull(syncState); return this; } @Override @NonNull public Distance build() { return new ImmutableDistanceImpl(_id, _trip, _location, _distance, _rate, _currency, _date, _timezone, _comment, _syncState); } }