import OrderedList from 'misago/utils/ordered-list';

export class Misago {
  constructor() {
    this._initializers = [];
    this._context = {};
  }

  addInitializer(initializer) {
    this._initializers.push({
      key: initializer.name,

      item: initializer.initializer,

      after: initializer.after,
      before: initializer.before
    });
  }

  init(context) {
    this._context = context;

    var initOrder = new OrderedList(this._initializers).orderedValues();
    initOrder.forEach(initializer => {
      initializer(this);
    });
  }

  // context accessors
  has(key) {
    return !!this._context[key];
  }

  get(key, fallback) {
    if (this.has(key)) {
      return this._context[key];
    } else {
      return fallback || undefined;
    }
  }

  pop(key) {
    if (this.has(key)) {
      let value = this._context[key];
      this._context[key] = null;
      return value;
    } else {
      return undefined;
    }
  }
}

// create  singleton
var misago = new Misago();

// expose it globally
global.misago = misago;

// and export it for tests and stuff
export default misago;