var isReloading = "TD_PLUGINS" in window;

if (isReloading){
  window.TD_PLUGINS.installed.forEach(plugin => {
    if (!window.TD_PLUGINS.isDisabled(plugin)){
      plugin.obj.disabled();
    }
  });
}

class PluginBase{
  constructor(pluginSettings){
    this.$pluginSettings = pluginSettings || {};
  }

  enabled(){}
  ready(){}
  disabled(){}
}

var PLUGINS = {
  installed: [],
  disabled: [],
  waiting: [],

  isDisabled: plugin => PLUGINS.disabled.includes(plugin.id),
  findObject: identifier => PLUGINS.installed.find(plugin => plugin.id === identifier),

  load: function(){
    PLUGINS.installed.forEach(plugin => {
      if (!PLUGINS.isDisabled(plugin)){
        plugin.obj.enabled();
        PLUGINS.runWhenReady(plugin);
      }
    });
  },

  onReady: function(){
    PLUGINS.waiting.forEach(plugin => plugin.obj.ready());
    PLUGINS.waiting = [];
  },

  runWhenReady: function(plugin){
    if (window.TD_APP_READY){
      plugin.obj.ready();
    }
    else{
      PLUGINS.waiting.push(plugin);
    }
  },

  setState: function(identifier, enable){
    var plugin = PLUGINS.findObject(identifier);

    if (enable && PLUGINS.isDisabled(plugin)){
      PLUGINS.disabled.splice(PLUGINS.disabled.indexOf(identifier),1);
      plugin.obj.enabled();
      PLUGINS.runWhenReady(plugin);
    }
    else if (!enable && !PLUGINS.isDisabled(plugin)){
      PLUGINS.disabled.push(identifier);
      plugin.obj.disabled();
    }
    else return;

    if (plugin.obj.$pluginSettings.requiresPageReload){
      window.location.reload();
    }
  }
};

window.TD_PLUGINS = PLUGINS;

if (isReloading){
  window.location.reload();
}