//angular.module('spgtag', []).run(function($rootScope, $window, $location, $http) {
angular.module('spgtag', []).run(function($rootScope, $window, $location, $http, $timeout) {

    $rootScope.checkAnalytics = function(portal_id) {
        $http.post('/api/x_zoso_documentati/zoomin_rest_api/zoominhelper', {
            'query': 'active=true^disable_analytics=false^portalid=' + portal_id
        }).then(function(resp) {
            $rootScope.isAnalyticsEnabled = resp.data.result;
        });
    };

    var $script = document.createElement('script');
    $script.innerText = "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-5MG82N9');";

    document.head.appendChild($script);

    var $noscript = document.createElement('noscript');
    $noscript.text = '<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5MG82N9"height="0" width="0" style="display:none;visibility:hidden"></iframe>';
    document.body.appendChild($noscript);

    $rootScope.analyticsHandler = function(object) {
        if ($rootScope.isAnalyticsEnabled) {
            $window.dataLayer.push(object);
        }
    }

    $rootScope.$on('$locationChangeSuccess', function(event, newUrl, oldUrl) {
        if (newUrl.indexOf("?id=zd_document&") == -1 && newUrl.indexOf("?id=search") == -1) { // ZFSNOW-341
            sessionStorage.setItem("cur_url", ""); // ZFSNOW-341
        }
        var portal_id = $rootScope.portal_id;
        if (!$rootScope.hasOwnProperty('isAnalyticsEnabled')) {
            $rootScope.checkAnalytics(portal_id);
        }

        $http.get('/api/x_zoso_documentati/zoomin_rest_api/getuserdata?portal_id=' + portal_id).then(function(resp) {
            var response = resp.data.result;
            var userDomain = response.userEmail.split('@')[1];
            var version = response.snAppVersion;
            var clientName = response.clientName;
            var userCrgs = response.userCrgs;

            if (oldUrl.indexOf('bundle') > -1 && newUrl.indexOf('bundle') == -1) {
                $rootScope.analyticsHandler({
                    event: "SN_PAGE_EXIT",
                    userCrgs: userCrgs,
                    application: "ServiceNow"
                });
            }
            var isSearchNewUrl = newUrl.indexOf('search') > -1;
            var isSearchOldUrl = oldUrl.indexOf('search') > -1;
            var isFilterNewUrl = newUrl.indexOf('str:') > -1;
            var isFilterOldUrl = oldUrl.indexOf('str:') > -1;
            var isSearchBothUrl = newUrl.indexOf('search') > -1 && oldUrl.indexOf('search') > -1;
            var isFilterOnlyOldUrl = newUrl.indexOf('str:') === -1 && oldUrl.indexOf('str:') > -1;
            var isFilterBothUrl = newUrl.indexOf('str:') > -1 && oldUrl.indexOf('str:') > -1;

            var user_id = $window.NOW.user_id;

            var userType = false;
            var user_domain = "";
            if (user_id) {
                userType = true;
            }

            if (!user_id) {
                user_id = createUUID();
            }
            var searchSource = '';

            //if (isSearchNewUrl && !isSearchOldUrl) { // search performed
            if (isSearchNewUrl) {
                var oldurlParams = "?id" + oldUrl.split("?id")[1];
                var urlPrams_ = new URLSearchParams(oldurlParams);
                if (oldurlParams.indexOf('q=') > -1) {
                    var searchTerm_ = urlPrams_.get('q');
                }

                var queryString = window.location.search;
                var urlParams = new URLSearchParams(queryString);
                var searchTerm = urlParams.get('q');
                searchSource = urlParams.get('t');
                if (searchTerm !== searchTerm_) {
                    $rootScope.analyticsHandler({
                        event: "SN_SEARCH_PERFORMED",
                        userCrgs: userCrgs,
                        application: 'ServiceNow',
                        snSearchTerm: searchTerm,
                        pageLanguageCode: $window.g_lang,
                        userId: user_id,
                        userLoggedIn: userType,
                        snSelectedFilter: modifyFilterParams(newUrl),
                        snSearchSource: "search_box",
                        //resultSource: searchSource
                        userDomain: userDomain,
                        snAppVersion: version,
                        clientName: clientName,
                    });
                }

                $rootScope.analyticsHandler({
                    clientName: clientName,
                    event: "SN_PAGE_VIEW",
                    sn_page_title: $window.location.title,
                    userCrgs: userCrgs,
                    application: "ServiceNow",
                    pageLanguageCode: $window.g_lang,
                    userDomain: userDomain,
                    userLoggedIn: userType,
                    userId: user_id,
                    authUserId: user_id,
                    snAppVersion: version,
                    local_time: new Date().toLocaleString()
                });

                //SN_SEARCH_FILTER_SELECTED
                if (searchSource) {

                    var query = oldUrl;
                    var oldUrld = new URLSearchParams(query).get('t');
                    if (oldUrld !== searchSource) {
                        //console.log('SEARCH_SOURCE_EVENT_CHANGED')
                    }
                }
            }

            if (isSearchBothUrl && isFilterNewUrl && !isFilterOldUrl) { // filter applied
                $rootScope.analyticsHandler({
                    event: "SN_SEARCH_RESULT_FILTER_SELECTED",
                    userCrgs: userCrgs,
                    application: 'ServiceNow',
                    snSelectedFilter: modifyFilterParams(newUrl),
                    pageLanguageCode: $window.g_lang,
                    userId: user_id,
                    userLoggedIn: userType,
                    snSearchResultSource: searchSource,
                    userDomain: userDomain,
                    snAppVersion: version,
                    clientName: clientName
                });
            }

            $rootScope.$on('sn_filter_reset', function(event, data) {
                if (data.reset) {
                    $rootScope.reset = true;
                }
            });

            if (isSearchBothUrl && isFilterOldUrl && $rootScope.reset == undefined && oldUrl.length > newUrl.length) {
                var oldUrl_ = modifyFilterParams(oldUrl);
                var newUrl_ = modifyFilterParams(newUrl);
                var url_dif = findDiff(newUrl_, oldUrl_);
                $rootScope.analyticsHandler({
                    event: "SN_SEARCH_RESULT_FILTER_REMOVED",
                    userCrgs: userCrgs,
                    application: 'ServiceNow',
                    snRemovedFilter: url_dif,
                    snFilterChangedTo: modifyFilterParams(newUrl),
                    pageLanguageCode: $window.g_lang,
                    userId: user_id,
                    userLoggedIn: userType,
                    snSearchResultSource: searchSource,
                    userDomain: userDomain,
                    snAppVersion: version,
                    clientName: clientName
                });
            }

            if (isSearchBothUrl) { // filter changed
                var newDataUrl = '';
                if (newUrl.length > oldUrl.length) {
                    newDataUrl = modifyFilterParams(newUrl).split(',');
                } else {
                    newDataUrl = modifyFilterParams(oldUrl).split(',');
                }
                var filter_old = "";
                var filter_new = "";
                if (oldUrl.indexOf('str:') > -1 || newUrl.indexOf('str:') > -1) {
                    filter_old = modifyFilterParams(oldUrl);
                    filter_new = modifyFilterParams(newUrl);
                }
                if (filter_old !== filter_new) {
                    var filterLabel = newDataUrl[newDataUrl.length - 1];
                    $rootScope.$broadcast('sn_search_performed', {
                        perform: true
                    });
                    $rootScope.analyticsHandler({
                        event: "SN_SEARCH_RESULT_FILTER_CHANGED",
                        userCrgs: userCrgs,
                        application: 'ServiceNow',
                        snFilterLabel: filterLabel,
                        snFilterChangedTo: modifyFilterParams(newUrl),
                        pageLanguageCode: $window.g_lang,
                        userId: user_id,
                        userLoggedIn: userType,
                        snSearchResultSource: searchSource,
                        userDomain: userDomain,
                        snAppVersion: version,
                        clientName: clientName
                    });
                }
            }
        });
    });

    function modifyFilterParams(filterUrl) {
        var modifiedFilterUrl = filterUrl.replaceAll('str:', '&str=');

        var searchParams = new URLSearchParams(modifiedFilterUrl);
        var filterSearchParams = searchParams.getAll('str');
        var filterParamsResult = filterSearchParams.join(',').replaceAll(',,', ',').replaceAll('[', '').replaceAll(']', '');

        return filterParamsResult;
    }

    function createUUID() {
        var s = [];
        var hexDigits = "0123456789abcdef";
        for (var i = 0; i < 32; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4";
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
        s[8] = s[13] = s[18] = s[23] = "-";
        return s.join("");
    }

    function findDiff(str1, str2) {
        var arr1 = str1.split(',');
        var arr2 = str2.split(',');
        var diff = "";
        for (var i = 0; i < arr2.length; i++) {
            if (arr1.indexOf(arr2[i]) === -1) {
                diff += arr2[i] + ",";
            }
        }
        return diff;
    }









});