package com.wealthfront.magellan.sample.advanced.tide;
import android.content.Context;
import android.widget.Toast;
import com.wealthfront.magellan.rx.RxScreen;
import com.wealthfront.magellan.sample.advanced.NoaaApi;
import com.wealthfront.magellan.sample.advanced.R;
import com.wealthfront.magellan.sample.advanced.model.Observation;
import com.wealthfront.magellan.sample.advanced.model.TideInfo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import rx.functions.Action1;
import static com.wealthfront.magellan.sample.advanced.SampleApplication.app;
import static rx.android.schedulers.AndroidSchedulers.mainThread;
public class TideDetailsScreen extends RxScreen<TideDetailsView> {
public static final Comparator<Observation> OBSERVATION_COMPARATOR = new Comparator<Observation>() {
@Override
public int compare(Observation o1, Observation o2) {
return o1.getVerifiedWaterLevel().compareTo(o2.getVerifiedWaterLevel());
}
};
@Inject NoaaApi noaaApi;
private final String tideLocationName;
int noaaApiId;
TideDetailsScreen(int noaaApiId, String tideLocationName) {
this.noaaApiId = noaaApiId;
this.tideLocationName = tideLocationName;
}
@Override
protected TideDetailsView createView(Context context) {
app(context).injector().inject(this);
return new TideDetailsView(context);
}
@Override
public String getTitle(Context context) {
return tideLocationName;
}
@Override
protected void onSubscribe(final Context context) {
autoUnsubscribe(noaaApi.getTideInfo(noaaApiId)
.observeOn(mainThread())
.subscribe(new Action1<TideInfo>() {
@Override
public void call(TideInfo tideInfo) {
if (tideInfo.getData() != null && !tideInfo.getData().isEmpty()) {
List<Observation> observations = tideInfo.getData();
BigDecimal highestMeasuredTideHeight =
Collections.max(filterOutNullMeasurements(observations), OBSERVATION_COMPARATOR)
.getVerifiedWaterLevel();
BigDecimal lowestMeasuredTideHeight =
Collections.min(filterOutNullMeasurements(observations), OBSERVATION_COMPARATOR)
.getVerifiedWaterLevel();
BigDecimal latestMeasuredTideHeight =
observations.get(observations.size() - 1).getVerifiedWaterLevel();
getView().setTideHeights(latestMeasuredTideHeight, lowestMeasuredTideHeight,
highestMeasuredTideHeight);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Toast.makeText(context, R.string.cannot_retrieve_tide_info, Toast.LENGTH_SHORT).show();
}
}));
}
private static List<Observation> filterOutNullMeasurements(List<Observation> listWithNulls) {
List<Observation> result = new ArrayList<>();
for (Observation item : listWithNulls) {
if (item.getVerifiedWaterLevel() != null) {
result.add(item);
}
}
return result;
}
}