# source : interceptors.js

    /**
     * @license Ulakbus-UI
     * Copyright (C) 2015 ZetaOps Inc.
     *
     * This file is licensed under the GNU General Public License v3
     * (GPLv3).  See LICENSE.txt for details.
     */
    angular.module('ulakbus')
        .config(['$httpProvider', function ($httpProvider) {
            /**
             * @memberof ulakbus.formService
             * @ngdoc interceptor
             * @name http_interceptor
             * @memberof ulakbus
             * @description The http interceptor for all requests and responses to check and config payload and response
             * objects.
             * - To prevent OPTIONS preflight request change header Content-Type to `text/plain`.
             * - 4xx - 5xx errors are handled in response objects.
             * - `_debug_queries` is helper object for development purposes to see how long the queries lasts.
             *   They are shown in /debug/list' page.
             * - API returns `is_login` key to check if current user is authenticated. Interceptor checks and if not logged
             *   in redirects to login page.
             */
            $httpProvider.interceptors.push(function ($q, $rootScope, $location, $timeout, $log) {
                return {
                    'request': function (config) {
                        if (config.method === "POST") {
                            // to prevent OPTIONS preflight request
                            config.headers["Content-Type"] = "text/plain";
                        }
                        return config;
                    },
                    'response': function (response) {
                        //Will only be called for HTTP up to 300
                        if (response.data._debug_queries) {
                            if (response.data._debug_queries.length > 0) {
                                $rootScope.debug_queries = $rootScope.debug_queries || [];
                                $rootScope.debug_queries.push({
                                    "url": response.config.url,
                                    "queries": response.data._debug_queries
                                });
                            }
                        }
                        if (response.data.is_login === false) {
                            $rootScope.loggedInUser = response.data.is_login;
                            $location.path("/login");
                        }
                        if (response.data.is_login === true) {
                            $rootScope.loggedInUser = true;
                            $rootScope.loginAttempt = 1; // this needs for popup errors
                            if ($location.path() === "/login") {
                                $location.path("/dashboard");
                            }
                        }
                        // if (response.data.client_cmd) {
                        //$location.path(response.data.screen);
                        // }
                        return response;
                    },
                    'responseError': function (rejection) {
                        var errorModal = function () {
                            if ($rootScope.loginAttempt === 0) {
                                $log.debug('not logged in, no alert message triggered');
                                return;
                            }
                            var codefield = "";
                            if (rejection.data.error) {
                                codefield = '<p><pre>' +
                                    rejection.data.error +
                                    '</pre></p>';
                            }
                            $('<div class="modal">' +
                                '<div class="modal-dialog" style="width:100%;" role="document">' +
                                '<div class="modal-content">' +
                                '<div class="modal-header">' +
                                '<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span' +
                                ' aria-hidden="true">×</span></button>' +
                                '<h4 class="modal-title" id="exampleModalLabel">' +
                                rejection.status + rejection.data.title +
                                '</h4>' +
                                '</div>' +
                                '<div class="modal-body">' +
                                '<div class="alert alert-danger">' +
                                '<strong>' +
                                rejection.data.description +
                                '</strong>' +
                                codefield +
                                '</div>' +
                                '</div>' +
                                '<div class="modal-footer">' +
                                '<button type="button" class="btn btn-default" data-dismiss="modal">Kapat</button>' +
                                '</div>' +
                                '</div>' +
                                '</div>' +
                                '</div>').modal();
                            try {
                                $('pre:not(.hljs)').each(function (i, block) {
                                    hljs.highlightBlock(block);
                                });
                            }
                            catch (e) {
                                $log.debug('Exception: ', e.message);
                            }
                        };
                        if (rejection.status === -1) {
                            rejection.status = 'Sunucu hatası'
                            rejection.data = {
                                title: "", description: 'Sunucu bağlantısında bir hata oluştu.' +
                                'Lütfen yetkili personelle iletişime geçiniz.'
                            };
                            $rootScope.$broadcast('alertBox', {
                                title: rejection.status,
                                msg: rejection.data.description,
                                type: 'error'
                            });
                        }
                        if (rejection.status === 400) {
                            $location.reload();
                        }
                        if (rejection.status === 401) {
                            $location.path('/login');
                            if ($location.path() === "/login") {
                                $log.debug("show errors on login form");
                            }
                        }
                        if (rejection.status === 403) {
                            if (rejection.data.is_login === true) {
                                $rootScope.loggedInUser = true;
                                if ($location.path() === "/login") {
                                    $location.path("/dashboard");
                                }
                            }
                            //errorModal();
                        }
                        $rootScope.$broadcast('show_notifications', rejection.data);
                        if (rejection.status === 404) {
                            errorModal();
                        }
                        if (rejection.status === 500) {
                            errorModal();
                        }
                        return $q.reject(rejection);
                    }
                };
            });
        }]);