(function () {
    angular.module('piwikApp').factory('http404CheckInterceptor', http404CheckInterceptor);

    http404CheckInterceptor.$inject = ['$q', 'globalAjaxQueue'];

    function http404CheckInterceptor($q, globalAjaxQueue) {

        function isClientError(rejection)
        {
            if (rejection.status === 500 || rejection.status <= 0) {
                return true;
            }

            return rejection.status >= 400 && rejection.status < 408;
        }

        return {
            'request': function(config) {
                if ('object' === typeof piwik.relativePluginWebDirs
                    && config && config.url && config.url.indexOf('plugins/') === 0
                    && config.url.indexOf('.html') > 0
                    && config.url.indexOf('/angularjs/') > 0) {

                    var urlParts = config.url.split('/');
                    if (urlParts && urlParts.length > 2 && urlParts[1]) {
                        var pluginName = urlParts[1];
                        if (pluginName && pluginName in piwik.relativePluginWebDirs && piwik.relativePluginWebDirs[pluginName]) {
                            urlParts[0] = piwik.relativePluginWebDirs[pluginName];
                            config.url = urlParts.join('/');
                        }
                    }
                }
                return config;
            },
            'responseError': function(rejection) {

                if (rejection &&
                    isClientError(rejection) &&
                    rejection.config &&
                    rejection.config.url &&
                    -1 !== rejection.config.url.indexOf('.html') &&
                    -1 !== rejection.config.url.indexOf('plugins')) {

                    var posEndUrl = rejection.config.url.indexOf('.html') + 5;
                    var url       = rejection.config.url.slice(0, posEndUrl);

                    var message = 'Please check your server configuration. You may want to whitelist "*.html" files from the "plugins" directory.';
                    message    += ' The HTTP status code is ' + rejection.status + ' for URL "' + url + '"';
                    
                    if (rejection.status === -1) {
                        message = 'Please check if you have an ad blocker or something similar enabled.';
                    }

                    var UI = require('piwik/UI');
                    var notification = new UI.Notification();
                    notification.show(message, {
                        title: 'Failed to load HTML file:',
                        context: 'error',
                        id: 'Network_HtmlFileLoadingError'
                    });
                }

                return $q.reject(rejection);
            }
        };
    }

    angular.module('piwikApp').config(['$httpProvider',function($httpProvider) {
        $httpProvider.interceptors.push('http404CheckInterceptor');
    }]);


})();

