package com.sweetzpot.stravazpot.activity.request; import com.sweetzpot.stravazpot.activity.api.ActivityAPI; import com.sweetzpot.stravazpot.activity.model.Activity; import com.sweetzpot.stravazpot.activity.model.ActivityType; import com.sweetzpot.stravazpot.activity.rest.ActivityRest; import com.sweetzpot.stravazpot.common.model.Distance; import com.sweetzpot.stravazpot.common.model.Time; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import retrofit2.Call; public class CreateActivityRequest { private final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); private final String name; private final ActivityRest restService; private final ActivityAPI api; private ActivityType type; private String startDate; private Time elapsedTime; private String description; private Distance distance; private Boolean isPrivate; private Boolean trainer; private Boolean commute; public CreateActivityRequest(String name, ActivityRest restService, ActivityAPI api) { this.name = name; this.restService = restService; this.api = api; } public CreateActivityRequest ofType(ActivityType type) { this.type = type; return this; } public CreateActivityRequest startingOn(Date startDate) { this.startDate = formatter.format(startDate); return this; } public CreateActivityRequest withElapsedTime(Time elapsedTime) { this.elapsedTime = elapsedTime; return this; } public CreateActivityRequest withDescription(String description) { this.description = description; return this; } public CreateActivityRequest withDistance(Distance distance) { this.distance = distance; return this; } public CreateActivityRequest isPrivate(boolean isPrivate) { this.isPrivate = isPrivate; return this; } public CreateActivityRequest withTrainer(boolean trainer) { this.trainer = trainer; return this; } public CreateActivityRequest withCommute(boolean commute) { this.commute = commute; return this; } public Activity execute() { Call<Activity> call = restService.createActivity(name, type, startDate, elapsedTime, description, distance, boolToInt(isPrivate), boolToInt(trainer), boolToInt(commute)); return api.execute(call); } private Integer boolToInt(Boolean booleanValue) { if(booleanValue == null) { return null; } else { return booleanValue ? 1 : 0; } } }