/**
* Calculate journey, fuel and electric ppm, total mileages
*
* @module
* @since 0.1.21
*/
import { isPHEV } from '../../../../classification';
import { getMPGofficalRatio } from '../../../journey/calculate';
import { co2_kg_per_litre as skv_co2_kg_per_litre, production_uplift_percentage } from '../../../../../maths/constants';
import { kmToMiles } from '../../../../../maths/conversions';
import { getIsCSMode } from '../../../util';
import {
productionUplift,
tailpipeCO2gPerMile,
iceCO2gPerMileFromWCCO2gPerMile,
calculateElectricCO2gPerMile,
} from './calculate';
/**
* Co2 grams per mile for PHEVs
* @param {struct} skv_config
* @returns {number}
* @module
*/
const iceCO2gPerMileForPHEVs = (skv_config) => {
// if (skv_config.is_cs_mode) {
const skv_fuel_cfg = {
// work out charge sustaining mode first
co2_kg_per_litre: skv_co2_kg_per_litre[skv_config.fuel_type],
mpg: skv_config.mpg,
wc_mpg: skv_config.wc_mpg,
tailpipe_co2_gpkm: skv_config.tailpipe_co2_gpkm,
is_cs_mode: skv_config.is_cs_mode,
battery_range_miles: skv_config.battery_range_miles,
};
// get the weighted combined co2 g per mile (i.e electric + ICE)
const wc_co2_g_per_mile = kmToMiles(skv_fuel_cfg.tailpipe_co2_gpkm, true);
// remove the electric portion from the weighted combined co2 g per mile
return iceCO2gPerMileFromWCCO2gPerMile(wc_co2_g_per_mile, skv_config.wc_mpg, skv_config.mpg);
};
/**
* calculate grams for ICE portion
* @param {struct} skv_config ice_pp_litre, mpg, vat_percentage
* @returns {struct}
*/
const iceCO2gPerMile = (skv_config) => {
const skv_return = {
tail_pipe: 0,
production: 0,
};
const skv_default_cfg = {
mpg: '',
mpg_user: '',
// weighted combined mpg
wc_mpg: '',
// wltp what comes out of tailpipe
tailpipe_co2_gpkm: '',
fuel_type: '',
// is charging sustaining mode likely passed in when calculating a journey
is_cs_mode: false,
// for removing the electric portion from weighted combined
battery_range_miles: '',
};
// replace default values with the ones from the config passed in
const skv_cfg = Object.assign(skv_default_cfg, skv_config);
if (isPHEV(skv_cfg.mpg, skv_cfg.battery_range_miles)) {
skv_return.tail_pipe = iceCO2gPerMileForPHEVs(skv_cfg);
skv_return.production = productionUplift(skv_return.tail_pipe, production_uplift_percentage);
} else {
skv_return.tail_pipe = tailpipeCO2gPerMile(skv_cfg.tailpipe_co2_gpkm);
skv_return.production = productionUplift(skv_return.tail_pipe, production_uplift_percentage);
}
// at this point we've calculated co2 gram per mile based on official figures
// if the user has provided a custom mpg then apply as a ratio
if (skv_config.mpg_user) {
const ratio = getMPGofficalRatio(skv_config.mpg, skv_config.mpg_user);
skv_return.tail_pipe *= ratio;
skv_return.production *= ratio;
}
return skv_return;
};
/**
* calculate grams for Electric portion
* @param {struct} skv_config tariff_co2_gpkwh, battery_range_miles, battery_total_capacity_kwh
* @returns {struct}
*/
const electricCO2gPerMile = (skv_config) => {
const skv_return = {
production: 0,
};
skv_return.production = calculateElectricCO2gPerMile(skv_config);
return skv_return;
};
/**
* get co2 grams on electric and ice
* @param {struct} skv_config
* @returns {struct}
*/
const getCO2gPerMile = (skv_config) => {
let skv_ice_result = {
tail_pipe: 0,
production: 0,
};
let skv_electric_result = {
production: 0,
};
const skv_default = {
total_miles: '',
// ICE
tailpipe_co2_gpkm: '',
fuel_type: '',
mpg: '',
wc_mpg: '',
// Electric
tariff_co2_gpkwh: '',
battery_range_miles: '',
battery_total_capacity_kwh: '',
};
// replace default values with the ones from the config passed in
const skv_local_config = Object.assign(skv_default, skv_config);
// Charge Sustaining mode for phevs
skv_local_config.is_cs_mode = getIsCSMode(skv_config);
if (skv_local_config.mpg > 0) {
skv_ice_result = iceCO2gPerMile(skv_local_config);
}
if (skv_config.battery_range_miles > 0) {
skv_electric_result = electricCO2gPerMile(skv_local_config);
}
return {
electric: skv_electric_result,
ice: skv_ice_result,
};
};
export {
getCO2gPerMile,
iceCO2gPerMile,
electricCO2gPerMile,
iceCO2gPerMileForPHEVs,
};