package com.evancharlton.mileage.dao;
import android.database.Cursor;
import java.util.ArrayList;
public class FillupSeries extends ArrayList<Fillup> {
private static final long serialVersionUID = 5304523564485608182L;
private double mTotalCost = 0D;
private double mEconomyVolume = 0D;
public FillupSeries(Fillup... fillups) {
final int length = fillups.length;
Fillup previous = null;
Fillup current = null;
for (int i = 0; i < length; i++) {
current = fillups[i];
if (previous != null && previous.hasNext() == false) {
previous.setNext(current);
}
if (current.hasPrevious() == false) {
current.setPrevious(previous);
}
super.add(current);
previous = current;
mTotalCost += current.getTotalCost();
}
}
@Override
public boolean add(Fillup fillup) {
if (size() > 0) {
last().setNext(fillup);
fillup.setPrevious(last());
}
super.add(fillup);
mTotalCost += fillup.getTotalCost();
mEconomyVolume = 0D;
return true;
}
public double getTotalDistance() {
if (size() >= 2) {
Fillup last = last();
// find the newest non-partial fillup
while (last.hasPrevious() && last.isPartial()) {
last = last.getPrevious();
}
Fillup first = first();
if (last == first) {
return 0D;
}
return Math.abs(last.getOdometer() - first.getOdometer());
}
return 0D;
}
public double getTotalVolume() {
return getEconomyVolume() + get(0).getVolume();
}
public long getTimeRange() {
return Math.abs(last().getTimestamp() - first().getTimestamp());
}
/**
* Gets the sum of all the volume values except for the first one, since
* it's not used in the calculation of fuel economy.
*
* @return
*/
public double getEconomyVolume() {
if (mEconomyVolume == 0) {
double total = 0D;
for (Fillup fillup : this) {
if (fillup.getPrevious() == null) {
continue; // ignore the first fillup for economy calculation
}
if (fillup.validForEconomy()) {
total += fillup.getVolume();
}
}
mEconomyVolume = total;
}
return mEconomyVolume;
}
public double getTotalCost() {
return mTotalCost;
}
public Fillup first() {
return get(0);
}
public Fillup last() {
return get(size() - 1);
}
/**
* In order for this to work, it's expected that the fillups are sorted in
* ascending order by odometer.
*
* @param cursor
* @return
*/
public static ArrayList<FillupSeries> load(Cursor cursor) {
ArrayList<FillupSeries> output = new ArrayList<FillupSeries>();
FillupSeries series = new FillupSeries();
while (cursor.moveToNext()) {
Fillup fillup = new Fillup(cursor);
if (fillup.isRestart()) {
output.add(series);
series = new FillupSeries();
}
series.add(fillup);
}
output.add(series);
return output;
}
}