const configStore = new Map();

const config = {
  get: (key, fallback) => configStore.has(key) ? configStore.get(key) : fallback,
  update: async (key, value) => {
    configStore.set(key, value);
  }
};

class EventEmitter {
  constructor() {
    this._listeners = [];
    this.event = (listener) => {
      this._listeners.push(listener);
      return { dispose: () => { this._listeners = this._listeners.filter(l => l !== listener); } };
    };
  }
  fire(value) {
    for (const l of this._listeners.slice()) l(value);
  }
  dispose() {
    this._listeners = [];
  }
}

module.exports = {
  EventEmitter,
  workspace: {
    workspaceFolders: [],
    getConfiguration: () => config,
    onDidChangeConfiguration: () => ({ dispose: () => {} }),
    fs: {
      writeFile: async () => {},
      delete: async () => {}
    }
  },
  window: {
    createOutputChannel: () => ({
      appendLine: () => {},
      show: () => {},
      dispose: () => {}
    }),
    createStatusBarItem: () => ({
      text: '',
      tooltip: '',
      command: '',
      backgroundColor: undefined,
      show: () => {},
      hide: () => {},
      dispose: () => {}
    }),
    showInformationMessage: async () => undefined,
    showWarningMessage: async () => undefined,
    showErrorMessage: async () => undefined
  },
  StatusBarAlignment: { Right: 2 },
  ThemeColor: class ThemeColor {
    constructor(id) {
      this.id = id;
    }
  },
  Uri: {
    file: (fsPath) => ({ fsPath, scheme: 'file' }),
    joinPath: (base, ...parts) => ({ fsPath: [base.fsPath, ...parts].join('/') })
  },
  ProgressLocation: { Notification: 15 },
  ConfigurationTarget: { Global: 1, Workspace: 2 }
};
