/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

(function () {
  "use strict";

  function randomEnabled(){
    var levels = ["enabled", "disabled"];
    return levels[Math.round(Math.random())];
  };


  angular.module('mCord')
  .factory('SetCSRFToken', function setCSRFToken($cookies) {
    return {
      request: function(request){
        request.headers['X-CSRFToken'] = $cookies.get('xoscsrftoken');
        request.headers['sessionId'] = $cookies.get('sessionid');
        return request;
      }
    };
  })
  .factory('clearCacheOnUpdate', function setCSRFToken($cookies) {
    // return {
    //   request: function(request){
    //     request.headers['X-CSRFToken'] = $cookies.get('xoscsrftoken');
    //     request.headers['sessionId'] = $cookies.get('sessionid');
    //     return request;
    //   }
    // };
  })
  .service('User', function($http, $q, $cookies, cordConfig){
    this.login = function(username, password){
      var deferred = $q.defer();
      var user;

      // logging in the user
      $http.post(cordConfig.url + '/api/utility/login/', {username: username, password: password})
      .then(function(res){
        $cookies.put('user', res.data.user);
        $cookies.put('sessionid', res.data.xossessionid);
        user = JSON.parse(res.data.user);
        return $http.get(cordConfig.url + '/xos/tenantrootprivileges?user=' + user.id);
      })
      .then(function(subscribers){
        // subscribers are an array because the way Django perform query
        // but one user is related to only one subscriber

        $cookies.put('subscriberId', subscribers.data[0].id);
        deferred.resolve(user);
      })
      .catch(function(e){
        deferred.reject(e);
        throw new Error(e);
      });

      return deferred.promise;
    };

    this.isLoggedIn = function(){
      var user = $cookies.get('user');
      if( angular.isDefined(user)){
        return true;
      }
      return false;
    };

    this.logout = function(){
      var deferred = $q.defer();
      var sessionId = $cookies.get('sessionid');
      $http.post(cordConfig.url + '/xoslib/logout/', {xossessionid: sessionId})
      .then(function(res){
        $cookies.remove('user');
        deferred.resolve();
      })
      .catch(function(e){
        throw new Error(e);
      });

      return deferred.promise;
    };
  });
}());