(function(back) {
  const SETTINGS_FILE = "run.json";
  var ExStats = require("exstats");
  var statsList = ExStats.getList();
  statsList.unshift({name:"-",id:""}); // add blank menu item
  var statsIDs = statsList.map(s=>s.id);

  // ...and overwrite them with any saved values
  // This way saved values are preserved if a new version adds more settings
  const storage = require('Storage')
  let settings = Object.assign({
    record: true,
    B1: "dist",
    B2: "time",
    B3: "pacea",
    B4: "bpm",
    B5: "step",
    B6: "caden",
    paceLength: 1000, // TODO: Default to either 1km or 1mi based on locale
    notify: {
      dist: {
        increment: 0,
        notifications: [],
      },
      step: {
        increment: 0,
        notifications: [],
      },
      time: {
        increment: 0,
        notifications: [],
      },
    },
  }, storage.readJSON(SETTINGS_FILE, 1) || {});
  function saveSettings() {
    storage.write(SETTINGS_FILE, settings)
  }

  function getBoxChooser(boxID) {
    return {
      min: 0, max: statsIDs.length-1,
      value: Math.max(statsIDs.indexOf(settings[boxID]),0),
      format: v => statsList[v].name,
      onchange: v => {
        settings[boxID] = statsIDs[v];
        saveSettings();
      },
    }
  }

  function sampleBuzz(buzzPatterns) {
    return buzzPatterns.reduce(function (promise, buzzPattern) {
        return promise.then(function () {
            return Bangle.buzz(buzzPattern[0], buzzPattern[1]);
        });
    }, Promise.resolve());
  }

  var menu = {
    '': { 'title': 'Run' },
    '< Back': back,
  };
  if (global.WIDGETS&&WIDGETS["recorder"])
    menu[/*LANG*/"Record Run"] = {
      value : !!settings.record,
      onchange : v => {
        settings.record = v;
        saveSettings();
      }
    };
  var notificationsMenu = {
    '< Back': function() { E.showMenu(menu) },
  }
  menu[/*LANG*/"Notifications"] = function() { E.showMenu(notificationsMenu)};
  ExStats.appendMenuItems(menu, settings, saveSettings);
  ExStats.appendNotifyMenuItems(notificationsMenu, settings, saveSettings);
  var vibPatterns = [/*LANG*/"Off", ".", "-", "--", "-.-", "---"];
  var vibTimes = [
    [],
    [[100, 1]],
    [[300, 1]],
    [[300, 1], [300, 0], [300, 1]],
    [[300, 1],[300, 0], [100, 1], [300, 0], [300, 1]],
    [[300, 1],[300, 0],[300, 1],[300, 0],[300, 1]],
  ];
  notificationsMenu[/*LANG*/"Dist Pattern"] = {
    value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))),
      min: 0, max: vibTimes.length - 1,
      format: v => vibPatterns[v]||/*LANG*/"Off",
      onchange: v => {
        settings.notify.dist.notifications = vibTimes[v];
        sampleBuzz(vibTimes[v]);
        saveSettings();
      }
  }
  notificationsMenu[/*LANG*/"Step Pattern"] = {
    value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))),
      min: 0, max: vibTimes.length - 1,
      format: v => vibPatterns[v]||/*LANG*/"Off",
      onchange: v => {
        settings.notify.step.notifications = vibTimes[v];
        sampleBuzz(vibTimes[v]);
        saveSettings();
      }
  }
  notificationsMenu[/*LANG*/"Time Pattern"] = {
    value: Math.max(0,vibTimes.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))),
      min: 0, max: vibTimes.length - 1,
      format: v => vibPatterns[v]||/*LANG*/"Off",
      onchange: v => {
        settings.notify.time.notifications = vibTimes[v];
        sampleBuzz(vibTimes[v]);
        saveSettings();
      }
  }
  var boxMenu = {
    '< Back': function() { E.showMenu(menu) },
  }
  Object.assign(boxMenu,{
    'Box 1': getBoxChooser("B1"),
    'Box 2': getBoxChooser("B2"),
    'Box 3': getBoxChooser("B3"),
    'Box 4': getBoxChooser("B4"),
    'Box 5': getBoxChooser("B5"),
    'Box 6': getBoxChooser("B6"),
  });
  menu[/*LANG*/"Boxes"] = function() { E.showMenu(boxMenu)};
  E.showMenu(menu);
})
