class Sessions {
  constructor() {
    this._localStorage = window.localStorage;
    this._sessionsButton = document.querySelector("#sessions-button");
    this._sessionList = document.querySelector("#sessions-dropdown");
    this._sessionLabel = document.querySelector("#sessions-button > .text");
    this._defaultSession = null;
    this._sessionsObject = null;
    this._init();
  }

  getDefaultSession() {
    return this._defaultSession.key;
  }

  _setSessionDefault() {
    this._sessionLabel.innerText = this._defaultSession.name;
  }

  _updateOnStartup() {
    var key =
      this._localStorage.getItem("defaultSession") ||
      this._sessionsObject[0].key ||
      lightdm.default_session;

    var session = this._sessionsObject.find((val) => {
      return val.key === key;
    });
    if (session === undefined) {
      // This should never happen
      this._defaultSession = { key: "awesome", name: "Awesome WM" };
    } else {
      this._defaultSession = session;
    }
    this._setSessionDefault();
  }

  _updateDefaults(sessionObj) {
    if (!sessionObj) return;
    this._defaultSession = sessionObj;
    this._localStorage.setItem("defaultSession", this._defaultSession.key);
  }

  _setSessionList() {
    var dropdown = this._sessionList;
    dropdown.innerHTML = "";
    for (let i = 0; i < this._sessionsObject.length; i++) {
      var name = this._sessionsObject[i].name;
      var li = document.createElement("li");
      var button = document.createElement("button");
      button.innerText = name;
      button.addEventListener("click", () => {
        this._updateDefaults(this._sessionsObject[i]);
        this._setSessionDefault();
      });

      li.appendChild(button);
      dropdown.appendChild(li);
    }
  }

  _setKeydown() {
    var dropdown = this._sessionList;
    dropdown.addEventListener("keydown", (ev) => {
      if (ev.keyCode == 27) {
        sessions_dropdown.classList.add("hide");
        this._sessionsButton.focus();
      }
    });
  }

  _setButton() {
    var dropdown = this._sessionList;
    document.querySelector("#screen").addEventListener("click", (ev) => {
      if (
        ev.target == this._sessionsButton ||
        ev.target.parentElement == this._sessionsButton
      ) {
        dropdown.classList.toggle("hide");
      } else if (
        ev.target != this._sessionList &&
        ev.target.closest(".dropdown") == null
      ) {
        dropdown.classList.add("hide");
      }
    });
    document.querySelector("#screen").addEventListener("focusin", (ev) => {
      if (
        !dropdown.contains(document.activeElement) &&
        document.activeElement != this._sessionsButton
      ) {
        dropdown.classList.add("hide");
      }
    });
  }

  _init() {
    this._sessionsObject = lightdm.sessions;
    this._updateOnStartup();
    this._setSessionList();
    this._setButton();
    this._setKeydown();
  }
}