text: 'use strict';
  
  function cleanCal (cal) {
    var clean = {
      scale: parseFloat(cal.scale) || 0
      , intercept: parseFloat(cal.intercept) || 0
      , slope: parseFloat(cal.slope) || 0
    };
  
    clean.valid = ! (clean.slope === 0 || clean.unfiltered === 0 || clean.scale === 0);
  
    return clean;
  }
  
  module.exports = function withRawGlucose (entry, cals, maxRaw) {
    maxRaw = maxRaw || 200;
  
    if ( entry.type === "mbg" || entry.type === "cal" ) {
      return entry;
    }
    var egv = entry.glucose || entry.sgv || 0;
  
    entry.unfiltered = parseInt(entry.unfiltered) || 0;
    entry.filtered = parseInt(entry.filtered) || 0;
  
    //TODO: add time check, but how recent should it be?
    //TODO: currently assuming the first is the best (and that there is probably just 1 cal)
    var cal = cals && cals.length > 0 && cleanCal(cals[0]);
  
    if (cal && cal.valid) {
      if (cal.filtered === 0 || egv < 40) {
        entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope);
      } else {
        var ratio = cal.scale * (entry.filtered - cal.intercept) / cal.slope / egv;
        entry.raw = Math.round(cal.scale * (entry.unfiltered - cal.intercept) / cal.slope / ratio);
      }
  
      if ( egv < 40 ) {
          if (entry.raw) {
              entry.glucose = entry.raw;
              entry.fromRaw = true;
              if (entry.raw <= maxRaw) {
                  entry.noise = 2;
              } else {
                  entry.noise = 3;
              }
          } else {
              entry.noise = 3;
          }
      } else if (! entry.noise) {
          entry.noise = 0;
      }
  
    }
    return entry;
  };
  