var window = self;
var Global = self;

importScripts("/javascripts/lodash.js", "/javascripts/aether.js");

try {
  //Detect very modern javascript support.
  (0,eval("'use strict'; let test = WeakMap && (class Test { *gen(a=7) { yield yield * () => true ; } });"));
  console.log("Modern javascript detected, aw yeah!");
  self.importScripts('/javascripts/esper.modern.js');  
} catch (e) {
  console.log("Legacy javascript detected, falling back...", e.message);
  self.importScripts('/javascripts/esper.js');  
}

//console.log("Aether Tome worker has finished importing scripts.");
var aethers = {};
var languagesImported = {};

var ensureLanguageImported = function(language) {
  if (languagesImported[language]) return;
  if (language === 'html') return;
  importScripts("/javascripts/app/vendor/aether-" + language + ".js");
  languagesImported[language] = true;
};

var createAether = function (spellKey, options) {
    ensureLanguageImported(options.language);
    aethers[spellKey] = new Aether(options);
    return JSON.stringify({
        "message": "Created aether for " + spellKey,
        "function": "createAether"
    });
};

var hasChangedSignificantly = function(spellKey, a,b,careAboutLineNumbers,careAboutLint) {
    var hasChanged = aethers[spellKey].hasChangedSignificantly(a,b,careAboutLineNumbers,careAboutLint);
    var functionName = "hasChangedSignificantly";
    var returnObject = {
        "function":functionName,
        "hasChanged": hasChanged,
        "spellKey": spellKey
    };
    return JSON.stringify(returnObject);
};

var updateLanguageAether = function(newLanguage) {
    ensureLanguageImported(newLanguage);
    for (var spellKey in aethers)
    {
        if (aethers.hasOwnProperty(spellKey))
        {
            aethers[spellKey].setLanguage(newLanguage);
        }
        
    }
};

var lint = function(spellKey, source) {
    var currentAether = aethers[spellKey];
    var lintMessages = currentAether.lint(source);
    var functionName = "lint";
    var returnObject = {
        "lintMessages": lintMessages,
        "function": functionName
    };
    return JSON.stringify(returnObject);
};

var transpile = function(spellKey, source) {
    var currentAether = aethers[spellKey];
    currentAether.transpile(source);
    var functionName = "transpile";
    var returnObject = {
        "problems": currentAether.problems,
        "function": functionName,
        "spellKey": spellKey
    };
    return JSON.stringify(returnObject);
};

self.addEventListener('message', function(e) {
    var data = JSON.parse(e.data);
    if (data.function == "createAether")
    {
        self.postMessage(createAether(data.spellKey, data.options));
    }
    else if (data.function == "updateLanguageAether")
    {
        updateLanguageAether(data.newLanguage);
    }
    else if (data.function == "hasChangedSignificantly")
    {
        self.postMessage(hasChangedSignificantly(
            data.spellKey,
            data.a,
            data.b,
            data.careAboutLineNumbers,
            data.careAboutLint
        ));
    }
    else if (data.function == "lint")
    {
        self.postMessage(lint(data.spellKey, data.source));
    }
    else if (data.function == "transpile")
    {
        self.postMessage(transpile(data.spellKey, data.source));
    }
    else
    {
        var message = "Didn't execute any function...";
        var returnObject = {"message":message, "function":"none"};
        self.postMessage(JSON.stringify(returnObject));
    }
}, false);