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.io.File;
import java.sql.Date;
import java.util.TimeZone;
import co.smartreceipts.android.model.PriceCurrency;
import co.smartreceipts.android.model.Source;
import co.smartreceipts.android.model.Trip;
import co.smartreceipts.android.model.impl.DefaultTripImpl;
import co.smartreceipts.android.sync.model.SyncState;
import co.smartreceipts.android.sync.model.impl.DefaultSyncState;
/**
* A {@link co.smartreceipts.android.model.Trip} {@link BuilderFactory}
* implementation, which will be used to generate instances of {@link co.smartreceipts.android.model.Trip} objects
*/
public final class TripBuilderFactory implements BuilderFactory<Trip> {
private File _dir;
private String _comment, _costCenter;
private Date _startDate, _endDate;
private TimeZone _startTimeZone, _endTimeZone;
private PriceCurrency _defaultCurrency;
private SyncState _syncState;
private Source _source;
public TripBuilderFactory() {
_dir = new File("");
_comment = "";
_costCenter = "";
_defaultCurrency = PriceCurrency.getDefaultCurrency();
_startDate = new Date(System.currentTimeMillis());
_endDate = _startDate;
_source = Source.Undefined;
_startTimeZone = TimeZone.getDefault();
_endTimeZone = TimeZone.getDefault();
_syncState = new DefaultSyncState();
}
public TripBuilderFactory(@NonNull Trip trip) {
_dir = trip.getDirectory();
_comment = trip.getComment();
_costCenter = trip.getCostCenter();
_defaultCurrency = PriceCurrency.getInstance(trip.getDefaultCurrencyCode());
_startDate = trip.getStartDate();
_endDate = trip.getEndDate();
_source = trip.getSource();
_startTimeZone = trip.getStartTimeZone();
_endTimeZone = trip.getEndTimeZone();
_syncState = trip.getSyncState();
}
public TripBuilderFactory setDirectory(@NonNull File directory) {
_dir = directory;
return this;
}
public TripBuilderFactory setStartDate(@NonNull Date startDate) {
_startDate = Preconditions.checkNotNull(startDate);
return this;
}
public TripBuilderFactory setStartDate(long startDate) {
_startDate = new Date(startDate);
return this;
}
public TripBuilderFactory setEndDate(@NonNull Date endDate) {
_endDate = Preconditions.checkNotNull(endDate);
return this;
}
public TripBuilderFactory setEndDate(long endDate) {
_endDate = new Date(endDate);
return this;
}
public TripBuilderFactory setStartTimeZone(@NonNull TimeZone startTimeZone) {
_startTimeZone = Preconditions.checkNotNull(startTimeZone);
return this;
}
public TripBuilderFactory setStartTimeZone(@Nullable String timeZoneId) {
if (timeZoneId != null) {
_startTimeZone = TimeZone.getTimeZone(timeZoneId);
}
return this;
}
public TripBuilderFactory setEndTimeZone(@NonNull TimeZone endTimeZone) {
_endTimeZone = Preconditions.checkNotNull(endTimeZone);
return this;
}
public TripBuilderFactory setEndTimeZone(@Nullable String timeZoneId) {
if (timeZoneId != null) {
_endTimeZone = TimeZone.getTimeZone(timeZoneId);
}
return this;
}
public TripBuilderFactory setDefaultCurrency(@NonNull PriceCurrency currency) {
_defaultCurrency = Preconditions.checkNotNull(currency);
return this;
}
public TripBuilderFactory setDefaultCurrency(@NonNull String currencyCode) {
if (TextUtils.isEmpty(currencyCode)) {
throw new IllegalArgumentException("The currency code cannot be null or empty");
}
_defaultCurrency = PriceCurrency.getInstance(currencyCode);
return this;
}
public TripBuilderFactory setDefaultCurrency(@Nullable String currencyCode, @NonNull String missingCodeDefault) {
if (TextUtils.isEmpty(currencyCode)) {
_defaultCurrency = PriceCurrency.getInstance(missingCodeDefault);
} else {
_defaultCurrency = PriceCurrency.getInstance(currencyCode);
}
return this;
}
public TripBuilderFactory setComment(@Nullable String comment) {
_comment = comment != null ? comment : "";
return this;
}
public TripBuilderFactory setCostCenter(@Nullable String costCenter) {
_costCenter = costCenter != null ? costCenter : "";
return this;
}
public TripBuilderFactory setSourceAsCache() {
_source = Source.Cache;
return this;
}
public TripBuilderFactory setSyncState(@NonNull SyncState syncState) {
_syncState = Preconditions.checkNotNull(syncState);
return this;
}
@Override
@NonNull
public Trip build() {
return new DefaultTripImpl(_dir, _startDate, _startTimeZone, _endDate, _endTimeZone, _defaultCurrency, _comment, _costCenter, _source, _syncState);
}
}