// latest versions from canjs/canjs 3.8.2 package.json
const canjsCanjsDeps = {
    "can-cid": "1.0.3",
    "can-component": "3.0.7",
    "can-compute": "3.0.10",
    "can-connect": "1.3.11",
    "can-connect-feathers": "3.5.5",
    "can-connect-cloneable": "0.1.3",
    "can-connect-signalr": "0.1.0",
    "can-construct": "3.1.1",
    "can-construct-super": "3.0.3",
    "can-control": "3.0.10",
    "can-define": "1.0.26",
    "can-define-stream": "0.1.1",
    "can-define-stream-kefir": "0.0.9",
    "can-define-validate-validatejs": "0.0.5",
    "can-deparam": "1.0.1",
    "can-ejs": "3.0.7",
    "can-event": "3.4.0",
    "can-fixture": "1.0.14",
    "can-fixture-socket": "0.6.2",
    "can-jquery": "3.0.7",
    "can-list": "3.0.5",
    "can-map": "3.0.7",
    "can-map-backup": "3.0.3",
    "can-map-define": "3.0.9",
    "can-namespace": "1.0.0",
    "can-observation": "3.1.5",
    "can-param": "1.0.1",
    "can-route": "3.0.11",
    "can-route-pushstate": "3.0.3",
    "can-set": "1.2.0",
    "can-simple-dom": "1.0.8",
    "can-simple-map": "3.1.4",
    "can-stache": "3.0.24",
    "can-stache-bindings": "3.1.5",
    "can-stache-converters": "3.1.0",
    "can-stream": "0.2.3",
    "can-stream-kefir": "0.2.3",
    "can-types": "1.0.4",
    "can-util": "3.7.0",
    "can-validate": "1.0.2",
    "can-validate-legacy": "1.0.2",
    "can-validate-validatejs": "0.0.6",
    "can-vdom": "3.0.3",
    "can-view-autorender": "3.0.4",
    "can-view-callbacks": "3.0.6",
    "can-view-href": "3.0.4",
    "can-view-import": "3.0.7",
    "can-view-live": "3.0.7",
    "can-view-model": "3.1.3",
    "can-view-nodelist": "3.0.4",
    "can-view-parser": "3.1.0",
    "can-view-scope": "3.1.4",
    "can-view-target": "3.0.7",
    "can-zone": "0.6.7",
    "steal-stache": "3.0.7"
};

// these depend on can-types, so must be updated in order to avoid
// "cannot have two versions of can-types" errors
const requiredDeps = [
    "can-component",
    "can-compute",
    "can-connect",
    "can-construct",
    "can-control",
    "can-define",
    "can-event",
    "can-event-radiochange",
    "can-list",
    "can-make-rest",
    "can-map",
    "can-map-define",
    "can-observation",
    "can-reflect",
    "can-route",
    "can-route-pushstate",
    "can-set",
    "can-simple-map",
    "can-stache",
    "can-stache-bindings",
    "can-symbol",
    "can-types",
    "can-util",
    "can-vdom",
    "can-view-autorender",
    "can-view-callbacks",
    "can-view-href",
    "can-view-import",
    "can-view-live",
    "can-view-model",
    "can-view-nodelist",
    "can-view-parser",
    "can-view-scope",
    "can-view-target",
    "steal-stache"
];

function updateVersions(deps) {
    const newDeps = {};
    
    Object.keys(deps).forEach((dep) => {
        // if dep exists in canjsDeps, set it to that version
        // otherwise, keep existing version
        newDeps[dep] = canjsCanjsDeps[dep] || deps[dep];
    });
    
    return newDeps;
}

function addMissingRequiredDependencies(deps) {
    const newDeps = Object.assign({}, deps);
    
    // make sure all required deps are added
    requiredDeps.forEach((dep) => {
        newDeps[dep] = canjsCanjsDeps[dep];
    });
    
    return newDeps;
}

module.exports = function transformer(file, api) {
  let src = file.source;
  
  try {
    src = JSON.parse(src);
      
    src.dependencies = updateVersions(src.dependencies);
    src.devDependencies = updateVersions(src.devDependencies);
    
    src.dependencies = addMissingRequiredDependencies(src.dependencies);
      
    // print result with 2-space indentation
    src = JSON.stringify(src, null, 2) + '\n';
  } catch(e) {
    console.error(e);
  }
  
  return src;
};