define([
  'angular',
  'lodash',
  'store',
  'config',
],
function (angular, _, store, config) {
  'use strict';

  var module = angular.module('grafana.services');

  module.service('contextSrv', function($rootScope, $timeout) {
    var self = this;

    function User() {
      if (window.grafanaBootData.user) {
        _.extend(this, window.grafanaBootData.user);
      }
    }

    // events
    $rootScope.$on('toggle-sidemenu', function() {
      self.toggleSideMenu();
    });

    this.hasRole = function(role) {
      return this.user.orgRole === role;
    };

    this.setSideMenuState = function(state) {
      this.sidemenu = state;
      store.set('grafana.sidemenu', state);
    };

    this.toggleSideMenu = function() {
      this.setSideMenuState(!this.sidemenu);

      $timeout(function() {
        $rootScope.$broadcast("render");
      }, 50);
    };

    this.getSidemenuDefault = function() {
      return this.hasRole('Admin');
    };

    this.version = config.buildInfo.version;
    this.lightTheme = false;
    this.user = new User();
    this.isSignedIn = this.user.isSignedIn;
    this.isGrafanaAdmin = this.user.isGrafanaAdmin;
    this.sidemenu = store.getBool('grafana.sidemenu', this.getSidemenuDefault());

    if (this.isSignedIn && !store.exists('grafana.sidemenu')) {
      // If the sidemenu has never been set before, set it to false.
      // This will result in this.sidemenu and the localStorage grafana.sidemenu
      // to be out of sync if the user has an admin role.  But this is
      // intentional and results in the user seeing the sidemenu only on
      // their first login.
      store.set('grafana.sidemenu', false);
    }

    this.isEditor = this.hasRole('Editor') || this.hasRole('Admin');
  });
});
