package com.sunlightlabs.congress.services;
import com.sunlightlabs.congress.models.CongressException;
import com.sunlightlabs.congress.models.UpcomingBill;
import org.apache.http.impl.cookie.DateUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UpcomingBillService {
private static String[] fields = {
"context", "chamber", "legislative_day", "congress", "source_type",
"bill_id", "bill", "range"
};
public static List<UpcomingBill> comingUp() throws CongressException {
Map<String,String> params = new HashMap<String,String>();
// require an attached bill
params.put("bill__exists", "true");
// soonest first, since this is the future
// within a day, list day-specific ones first, then week-specific
params.put("order", "legislative_day__asc,range__asc");
// only look for upcoming bills whose upcoming date is more than a week ago
GregorianCalendar calendar = new GregorianCalendar(DateUtils.GMT);
calendar.add(Calendar.DATE, -7);
Date now = calendar.getTime();
params.put("legislative_day__gte", Congress.formatDateOnly(now));
return upcomingBillsFor(Congress.url("upcoming_bills", fields, params, 1, Congress.MAX_PER_PAGE));
}
protected static UpcomingBill fromAPI(JSONObject json) throws JSONException, ParseException, CongressException {
UpcomingBill upcoming = new UpcomingBill();
if (!json.isNull("context"))
upcoming.context = json.getString("context");
if (!json.isNull("chamber"))
upcoming.chamber = json.getString("chamber");
// field can be present but actually null
if (!json.isNull("legislative_day"))
upcoming.legislativeDay = Congress.parseDateOnly(json.getString("legislative_day"));
if (!json.isNull("range"))
upcoming.range = json.getString("range");
if (!json.isNull("bill_id"))
upcoming.billId = json.getString("bill_id");
if (!json.isNull("source_type"))
upcoming.sourceType = json.getString("source_type");
if (!json.isNull("url"))
upcoming.sourceUrl = json.getString("url");
if (!json.isNull("congress"))
upcoming.congress = json.getInt("congress");
if (!json.isNull("bill"))
upcoming.bill = BillService.fromAPI(json.getJSONObject("bill"));
return upcoming;
}
private static List<UpcomingBill> upcomingBillsFor(String url) throws CongressException {
List<UpcomingBill> upcomings = new ArrayList<UpcomingBill>();
try {
JSONArray results = Congress.resultsFor(url);
int length = results.length();
for (int i = 0; i < length; i++)
upcomings.add(fromAPI(results.getJSONObject(i)));
} catch (JSONException e) {
throw new CongressException(e, "Problem parsing the JSON from " + url);
} catch (ParseException e) {
throw new CongressException(e, "Problem parsing a date in the JSON from " + url);
}
return upcomings;
}
}