const Ci = Components.interfaces;
const Cu = Components.utils;

Cu.import("resource://gre/modules/Services.jsm");

// Useful piece of code from :bent
// http://mxr.mozilla.org/mozilla-central/source/dom/workers/test/extensions/bootstrap/bootstrap.js
function registerAddonResourceHandler(data) {
  let file = data.installPath;
  let fileuri = file.isDirectory() ?
                Services.io.newFileURI(file) :
                Services.io.newURI("jar:" + file.path + "!/", null, null);
  let resourceName = encodeURIComponent(data.id.replace("@", "at"));

  Services.io.getProtocolHandler("resource").
              QueryInterface(Ci.nsIResProtocolHandler).
              setSubstitution(resourceName, fileuri);

  return "resource://" + resourceName + "/";
}

let mainModule;

function install(data, reason) {}
function uninstall(data, reason) {}

function startup(data, reason) {
  let uri = registerAddonResourceHandler(data);

  let loaderModule =
    Cu.import('resource://gre/modules/commonjs/toolkit/loader.js').Loader;
  let { Loader, Require, Main } = loaderModule;

  const { ConsoleAPI } = Cu.import("resource://gre/modules/devtools/Console.jsm");

  let loader = Loader({
    paths: {
      "./": uri + "lib/",
      "": "resource://gre/modules/commonjs/"
    },
    globals: {
      console: new ConsoleAPI({
        prefix: data.id
      })
    },
    modules: {
      "toolkit/loader": loaderModule,
      addon: {
        id: data.id,
        version: data.version,
        uri: uri
      }
    }
  });

  let require_ = Require(loader, { id: "./addon" });
  mainModule = require_("./main");
}

function shutdown(data, reason) {
  if (mainModule && mainModule.shutdown) {
    mainModule.shutdown();
  }
}

function uninstall(data, reason) {}

