package gov.nysenate.openleg.service.spotcheck.senatesite.agenda;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import gov.nysenate.openleg.client.view.agenda.AgendaItemView;
import gov.nysenate.openleg.model.agenda.AgendaId;
import gov.nysenate.openleg.model.entity.Chamber;
import gov.nysenate.openleg.model.entity.CommitteeId;
import gov.nysenate.openleg.model.spotcheck.senatesite.SenateSiteDump;
import gov.nysenate.openleg.model.spotcheck.senatesite.SenateSiteDumpFragment;
import gov.nysenate.openleg.model.spotcheck.senatesite.agenda.SenateSiteAgenda;
import gov.nysenate.openleg.model.spotcheck.senatesite.agenda.SenateSiteAgendaBill;
import gov.nysenate.openleg.processor.base.ParseError;
import gov.nysenate.openleg.service.spotcheck.senatesite.base.JsonParser;
import gov.nysenate.openleg.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by PKS on 4/28/16.
*/
@Service
public class AgendaJsonParser extends JsonParser {
@Autowired
ObjectMapper objectMapper;
public List<SenateSiteAgenda> parseAgendas(SenateSiteDump agendaDump) throws ParseError {
return agendaDump.getDumpFragments().stream()
.flatMap(fragment -> extractAgendasFromFragment(fragment).stream())
.collect(Collectors.toList());
}
private List<SenateSiteAgenda> extractAgendasFromFragment(SenateSiteDumpFragment fragment) throws ParseError{
try {
JsonNode agendaMap = objectMapper.readTree(fragment.getFragmentFile())
.path("agendas");
if (agendaMap.isMissingNode()) {
throw new ParseError("Could not locate \"agendas\" node in senate site agenda dump fragment file: " +
fragment.getFragmentFile().getAbsolutePath());
}
List<SenateSiteAgenda> agendas = new LinkedList<>();
for (JsonNode agendaNode : agendaMap) {
agendas.add(extractSenSiteAgenda(agendaNode, fragment));
}
return agendas;
} catch (IOException | NoSuchElementException ex) {
throw new ParseError("error while reading senate site agenda dump fragment file: " +
fragment.getFragmentFile().getAbsolutePath(),
ex);
}
}
private SenateSiteAgenda extractSenSiteAgenda(JsonNode agendaNode, SenateSiteDumpFragment fragment) throws IOException {
SenateSiteAgenda agenda = new SenateSiteAgenda(DateUtils.endOfDateTimeRange(fragment.getDumpId().getRange()));
agenda.setAgendaId(new AgendaId(getIntValue(agendaNode,"field_ol_week"),getIntValue(agendaNode,"field_ol_year")));
agenda.setCommittee(new CommitteeId(Chamber.SENATE, getValue(agendaNode,"field_ol_committee_name")));
agenda.setAddendum((getValue(agendaNode,"field_ol_agenda_addendum") != null) ? getValue(agendaNode,"field_ol_agenda_addendum") : "");
List<String> nodes = getStringListValue(agendaNode,"field_ol_agenda_bills");
List<SenateSiteAgendaBill> agendaBills = (nodes != null) ? getAgendaBills(nodes) : null;
agenda.setAgendaBills(agendaBills);
return agenda;
}
private List<SenateSiteAgendaBill> getAgendaBills(List<String> agendaBillsStrings) throws IOException {
List<SenateSiteAgendaBill> agendaBills = new ArrayList<>();
for (String agendaBill : agendaBillsStrings){
JsonNode node = objectMapper.readTree(agendaBill);
SenateSiteAgendaBill ssAgendaBill = new SenateSiteAgendaBill();
ssAgendaBill.setAbstainedCount(getIntValue(node,"field_ol_abstained_count"));
ssAgendaBill.setAyeCount(getIntValue(node,"field_ol_aye_count"));
ssAgendaBill.setAyeWrCount(getIntValue(node,"field_ol_aye_wr_count"));
ssAgendaBill.setBillMessage(getValue(node,"field_ol_bill_message"));
ssAgendaBill.setExcusedCount(getIntValue(node,"field_ol_excused_count"));
ssAgendaBill.setNayCount(getIntValue(node,"field_ol_nay_count"));
TypeReference<AgendaItemView> type = new TypeReference<AgendaItemView>() {};
ssAgendaBill.setBillName(deserializeValue(node,"field_ol_bill_name",type).get());
agendaBills.add(ssAgendaBill);
}
return agendaBills;
}
}