Source: database/createBill.js

var Bill = require("./models/Bill");
var getBill = require("../scraper/getBill");
var printBill = require("../parser/printBill");
var tagBill = require("../parser/tagBill");
var getBillStatus = require("../scraper/getBillStatus");

/**
 * Adds a Bill schema to the bill database
 * @param {string} bill - Name of the bill (i.e. BILLS-113hr1033rs)
 * @param {object} options - Options (Optional)
 * @param {number} session - Session Number (Default: 1)
 * @return {object} - JSON result
 * @example
 * createBill("BILLS-113hr1033rs", {session: 2});
 */

var createBill = function(bill, options){
  //TODO: make this more resilient to errors

  options = options || {};
  var session = ("session" in options) ? options.session : 1;
  if(typeof session != "number" || (session != 1 && session != 2)) throw new TypeError("'options.session' must be either 1 or 2");

  var newBill = new Bill();
  newBill.congress = bill.replace("BILLS-", "").replace(/(s|hr).+$/g, "");
  newBill.session = session;
  newBill.type = bill.replace(/BILLS-11[3-5]/, "").replace(/[0-9]+[a-z]{2,}$/g, "");
  newBill.url = "https://www.gpo.gov/fdsys/bulkdata/BILLS/" + newBill.congress + "/" + newBill.session + "/" + newBill.type + "/" + bill + ".xml";

  Bill.find({url: newBill.url}, function (err, bills){
    if(!bills.length){
      getBill(bill, function(res, err){
        if(!err){
          printBill(res, function(parsedResult){
            newBill.text = parsedResult.body;
            newBill.title = parsedResult.head.title;
            if (parsedResult.head.chamber == "IN THE SENATE OF THE UNITED STATES") newBill.chamber = 'senate';
            else if (parsedResult.head.chamber == "IN THE HOUSE OF REPRESENTATIVES") newBill.chamber = 'house';
            else newBill.chamber = parsedResult.head.chamber;

            if(typeof parsedResult.head.number == "object") newBill.number = parsedResult.head.number._;
            else newBill.number = parsedResult.head.number;

            newBill.numberInt = parseInt(newBill.number.replace(/\D/g, ""));

            var billStatusName = "BILLSTATUS-" + newBill.congress + newBill.type + newBill.numberInt;

            newBill.statusUrl = "https://www.gpo.gov/fdsys/bulkdata/BILLSTATUS/" + newBill.congress + "/" + newBill.type + "/" + billStatusName + ".xml";

            tagBill(parsedResult, function(tags){
              newBill.tags = tags;

              getBillStatus(billStatusName, function(res){
                newBill.billStatus = res;
                newBill.save(function(err){
                  if(err) throw Error("Unable to save bill to database");
                  else console.log("Successfully saved " + bill + " to database");
                });
              });
            });
          });
        }
      }, {session: session});
    }
  });
};

module.exports = createBill;