angular.module('sn.common.analytics').factory("snAnalytics", function($rootScope) {
    "use strict";
    var instanceLevelEnabled = NOW.analytics_enabled && NOW.sp_analytics_plugin_active;
    var authKeyPresent = !!NOW.instrumentation_authkey_hisp;
    var unauthenticatedUserTrackingEnabled = NOW.unauthenticated_user_tracking_enabled || false;

    initializeAnalyticsSDK(); // on page refresh we need to invoke sdk

    $rootScope.$on('sn.ucm.finished', function() { // once ucm is finished we need to invoke sdk
        initializeAnalyticsSDK();
    });

    function initializeAnalyticsSDK() {
        if (!allowAnalytics())
            return;

        var options = {
            "serverEndpoint": NOW.instrumentation_api_host,
			"trackingConsent": "Full" //Fix for PRB1531325
        };

        //For unauthenticated user, not sending the userId and tracking consent
        //For new unauthenticated user session - userID null will assign Anonymous and consent is true by default
        //For later unauthenticated user session - userID and consent are retained from last logged in user
        if (!unauthenticatedUserTrackingEnabled || NOW.user_name !== 'guest') {
            options["userId"] = NOW.user_id_hashed;
        }

        SNAnalytics.start(getApiKey(), NOW.instrumentation_authkey_hisp, options);

        if (NOW.instance_name)
            setUserProperty("Instance Name", NOW.instance_name);

        if (NOW.domain_id)
            setUserProperty("Domain", NOW.domain_id);

        //hisp user properties changes removed
        // 		if (NOW.portal_id === "d0ccc2ce4fd612004e2d2e35f110c77c") {
        // 			if (NOW.user_type)
        // 				setUserProperty("User Type", NOW.user_type);

        // 			if (NOW.company_name)
        // 				setUserProperty("Company", NOW.company_name);

        // 			if (NOW.user_role)
        // 				setUserProperty("Role", NOW.user_role);
        // 		}

    }

    function getApiKey() {
        var _portal = NOW.portal_id;
        _portal = _portal === "45d6680fdb52220099f93691f0b8f5ad" ? "b157644bdbd6e010dd03a40fd39619d9" : _portal;
        return NOW.instance_id + ":" + _portal;
    }

    function setUserProperty(name, value) {
        if (!allowAnalytics())
            return;

        SNAnalytics.setUserProperty(name, value);
    }

    function setUserProperties(properties) {
        if (!allowAnalytics())
            return;

        SNAnalytics.setUserProperties(properties);
    }

    function removeUserProperty(name) {
        if (!allowAnalytics())
            return;

        SNAnalytics.removeUserProperty(name);
    }

    function appendToUserProperty(name, value) {
        if (!allowAnalytics())
            return;

        SNAnalytics.appendToUserProperty(name, value);
    }

    function incUserProperty(name, value) {
        if (!allowAnalytics())
            return;

        SNAnalytics.incUserProperty(name, value);
    }

    function startPage(id, title) {
        if (!allowAnalytics())
            return;

        SNAnalytics.startPage(id, title);
    }

    function multipleEventsInPayload(payload) {
        var eventName = payload.parentEvent.EventName || "";
        var eventPayload = payload.parentEvent.EventPayload;
        if (eventName && eventPayload)
            SNAnalytics.addEvent(eventName, eventPayload);

        var childEvents = payload.childEvents;
        if (childEvents) {
            var childEventName;
            var childEventPayload;
            for (var i = 0; i < childEvents.length; i++) {
                childEventName = childEvents[i]['EventName'];
                childEventPayload = childEvents[i]['EventPayload'];
                if (childEventName && childEventPayload)
                    SNAnalytics.addEvent(childEventName, childEventPayload);
            }
        }
    }

    function addEvent(payload) {
        if (!allowAnalytics())
            return;

        if (payload.parentEvent) {
            multipleEventsInPayload(payload);
            return;
        }

        if (payload.name && payload.data)
            SNAnalytics.addEvent(payload.name, payload.data);
    }

    function allowAnalytics() {
        if (!instanceLevelEnabled)
            return false;

        if (NOW.usage_tracking.usage_tracking_allowed_for_session && authKeyPresent && NOW.user_name !== 'guest')
            return true;

        else if (unauthenticatedUserTrackingEnabled && authKeyPresent && NOW.user_name === 'guest')
            return true;

        return false;
    }

    $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
        //while logging out turn off tracking and remove user ID
        if (newUrl.indexOf('logout.do') !== -1) {
            //not clearing userID and retaining consent when unauthenticated user tracking is enabled
            if (unauthenticatedUserTrackingEnabled && authKeyPresent) {
                // Send a Logout event for the session
                // (if session is finished because of timeout, sending an event will cause SNAnalytics to start a new session)
                var payload = {};
                payload.name = "Successful Logout";
                payload.data = {};
                payload.data["Login"] = false;
                addEvent(payload);
            } else if (allowAnalytics()) {
                SNAnalytics.setTrackingConsent('Disabled');
            }
        }
    });

    var util = {
        addEvent: addEvent,
        startPage: startPage,
        setUserProperty: setUserProperty,
        setUserProperties: setUserProperties,
        removeUserProperty: removeUserProperty,
        appendToUserProperty: appendToUserProperty,
        incUserProperty: incUserProperty
    };

    return util;
});