package ru.orangesoftware.financisto2.recur;
import com.google.ical.iter.RecurrenceIterator;
import com.google.ical.iter.RecurrenceIteratorFactory;
import com.google.ical.util.TimeUtils;
import com.google.ical.values.RRule;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
import static ru.orangesoftware.financisto2.recur.RecurrencePeriod.dateToDateValue;
import static ru.orangesoftware.financisto2.recur.RecurrencePeriod.dateValueToDate;
public class DateRecurrenceIterator {
private final RecurrenceIterator ri;
private Date firstDate;
private DateRecurrenceIterator(RecurrenceIterator ri) {
this.ri = ri;
}
public boolean hasNext() {
return firstDate != null || ri.hasNext();
}
public Date next() {
if (firstDate != null) {
Date date = firstDate;
firstDate = null;
return date;
}
return dateValueToDate(ri.next());
}
public static DateRecurrenceIterator create(RRule rrule, Date nowDate, Date startDate) throws ParseException {
RecurrenceIterator ri = RecurrenceIteratorFactory.createRecurrenceIterator(rrule,
dateToDateValue(startDate), TimeUtils.utcTimezone());
Date date = null;
while (ri.hasNext() && (date = dateValueToDate(ri.next())).before(nowDate));
//ri.advanceTo(dateToDateValue(nowDate));
DateRecurrenceIterator iterator = new DateRecurrenceIterator(ri);
iterator.firstDate = date;
return iterator;
}
public static DateRecurrenceIterator empty() {
return new EmptyDateRecurrenceIterator();
}
private static class EmptyDateRecurrenceIterator extends DateRecurrenceIterator {
public EmptyDateRecurrenceIterator() {
super(null);
}
@Override
public boolean hasNext() {
return false;
}
@Override
public Date next() {
return null;
}
}
}