var servicesModule = angular.module('myApp.services', []);

servicesModule.factory('errorService', function() {
  return {
    errorMessage: null,
    setError: function(msg) {
      this.errorMessage = msg;
    },
    clear: function() {
      this.errorMessage = null;
    }
  };
});

servicesModule.config(function ($httpProvider) {
  $httpProvider.responseInterceptors.push('errorHttpInterceptor');
});

// Rejestracja interceptora jako usługi
// przechwytującej WSZYSTKIE żądania AngularJS AJAX HTTP.
servicesModule.factory('errorHttpInterceptor', function ($q, $location, ErrorService, $rootScope) {
  return function (promise) {
    return promise.then(function (response) {
      return response;
    }, function (response) {
      if (response.status === 401) {
        $rootScope.$broadcast('event:loginRequired');
      } else if (response.status >= 400 && response.status < 500) {
        ErrorService.setError('Serwer nie odnalazł szukanego zasobu... Przepraszamy!!');
      }
      return $q.reject(response);
    });
  };
});

servicesModule.factory('Authentication', function() {
  return {
    getTokenType: function() {
      return 'Wspaniale';
    },
    getAccessToken: function() {
      // W rzeczywistości dane należy pobrać z serwera.
      return 'asdads131321asdasdasdas';
    }
  };
});

// Ta usługa typu factory jest tworzona tylko jednokrotnie, a authHttp pozostaje zapamiętana. Dzięki temu
// przyszłe żądania authHttp spowodują zwrot tego samego egzemplarza authHttp.
servicesModule.factory('authHttp', function($http, Authentication) {
  var authHttp = {};

  // Wstawienie w żądaniu odpowiedniego nagłówka.
  var extendHeaders = function(config) {
    config.headers = config.headers || {};
    config.headers['Authorization'] = Authentication.getTokenType() + ' ' + Authentication.getAccessToken();
  };

  // Poniższy kod należy wykonać dla każdego wywołania $http.
  angular.forEach(['get', 'delete', 'head', 'jsonp'], function(name) {
    authHttp[name] = function(url, config) {
      config = config || {};
      extendHeaders(config);
      return $http[name](url, config);
    };
  });

  angular.forEach(['post', 'put'], function(name) {
    authHttp[name] = function(url, data, config) {
      config = config || {};
      extendHeaders(config);
      return $http[name](url, data, config);
    };
  });

  return authHttp;
});
