package com.novoda.enews;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
class ApiPagedResponse {
private final List<ApiPagedChannelHistory> responses = new ArrayList<>();
private LocalDateTime lastResponseDateTime;
private boolean hasMore = false;
public ApiPagedResponse(LocalDateTime start) {
this.lastResponseDateTime = start;
}
public boolean hasMoreResponses() {
return hasMore;
}
public void addResponse(ApiPagedChannelHistory apiPagedChannelHistory) {
updateLastResponseDateTime(apiPagedChannelHistory);
responses.add(apiPagedChannelHistory);
}
private void updateLastResponseDateTime(ApiPagedChannelHistory apiPagedChannelHistory) {
List<ApiPagedChannelHistory.ApiMessage> apiMessages = apiPagedChannelHistory.apiMessages;
ApiPagedChannelHistory.ApiMessage oldestApiMessage = apiMessages.get(apiMessages.size() - 1);
String lastResponseEpochTime = oldestApiMessage.timeStamp;
lastResponseDateTime = convertToLocalDateTime(lastResponseEpochTime);
hasMore = apiPagedChannelHistory.hasMore;
}
private LocalDateTime convertToLocalDateTime(String lastResponseEpochTime) {
int decimalSplit = lastResponseEpochTime.indexOf(".");
Long epochSecond = Long.valueOf(lastResponseEpochTime.substring(0, decimalSplit));
Integer nanoOfSecond = Integer.valueOf(lastResponseEpochTime.substring(decimalSplit + 1));
ZoneOffset timezone = ZoneOffset.UTC;
return LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, timezone);
}
public String getLastResponseEpochTime() {
return String.valueOf(lastResponseDateTime.toEpochSecond(ZoneOffset.UTC));
}
public List<ApiPagedChannelHistory> getResponses() {
return responses;
}
public boolean responsesAreAfter(LocalDateTime dateTime) {
List<ApiPagedChannelHistory.ApiMessage> latestMessages = responses.get(responses.size() - 1).apiMessages;
ApiPagedChannelHistory.ApiMessage latestMessage = latestMessages.get(latestMessages.size() - 1);
LocalDateTime latestMessageDateTime = convertToLocalDateTime(latestMessage.timeStamp);
return latestMessageDateTime.isAfter(dateTime);
}
}