package org.openbankdata.bank.americanexpress.client;
import org.openbankdata.core.client.BankResponse;
import org.openbankdata.core.client.Pagination;
import org.openbankdata.core.client.PaginationStrategy;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.util.Locale;
/**
* PaginationStrategy for AmericanExpress transactions.
*/
public class AmericanExpressTransactionPaginationStrategy implements PaginationStrategy {
private LocalDate mFromDateTime;
private LocalDate mToDateTime;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern("MMM d, yyyy").withLocale(
new Locale("sv-SE"));
public AmericanExpressTransactionPaginationStrategy(LocalDate pFromDateTime, LocalDate pToDateTime) {
mFromDateTime = pFromDateTime;
mToDateTime = pToDateTime;
}
public AmericanExpressTransactionPaginationStrategy() {}
@Override
public Pagination parsePagination(BankResponse pBankResponse) {
Pagination pagination = new Pagination();
Document doc = Jsoup.parse(pBankResponse.body());
Element element = doc.select("#viewPeriod option[selected]").first();
Element previous = element.previousElementSibling();
if (previous != null) {
pagination.setPrev(Integer.parseInt(previous.val()));
}
Element next = element.nextElementSibling();
if (next != null && isDateWithinRange(next)) {
pagination.setNext(Integer.parseInt(next.val()));
} else {
pagination.setNext(-1);
}
pagination.setFirst(0);
pagination.setLast(Integer.parseInt(element.lastElementSibling().val()));
return pagination;
}
private boolean isDateWithinRange(Element elem) {
String fromDateString = elem.text().substring(0, elem.text().indexOf("till")).trim();
LocalDate toDate = LocalDate.now();
if (!"0".equals(elem.val())) {
String toDateString = elem.text().substring(fromDateString.length() + 5).trim();
toDate = DATE_FORMATTER.parseLocalDate(toDateString);
}
return mToDateTime == null ? true : mFromDateTime.isBefore(toDate);
}
@Override
public String getPaginationParameter() {
return "BPIndex";
}
}