;(function (global) {

'use strict'

var $ = global.jQuery
var GOVUK = global.GOVUK || {}

var GoogleAnalyticsUniversalTracker = function (trackingId, fieldsObject) {
  function configureProfile () {
    // https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference#create
    sendToGa('create', trackingId, fieldsObject)
  }

  function anonymizeIp () {
    // https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#anonymizeip
    sendToGa('set', 'anonymizeIp', true)
  }

  function disableAdTracking () {
    // https://support.google.com/analytics/answer/2444872?hl=en
    sendToGa('set', 'displayFeaturesTask', null)
  }

  // Support legacy cookieDomain param
  if (typeof fieldsObject === 'string') {
    fieldsObject = { cookieDomain: fieldsObject }
  }

  configureProfile()
  anonymizeIp()
  disableAdTracking()
}

GoogleAnalyticsUniversalTracker.load = function () {
  /* eslint-disable */
  (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
    (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o),
                           m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
  })(global, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga')
  /* eslint-enable */
}

// https://developers.google.com/analytics/devguides/collection/analyticsjs/pages
GoogleAnalyticsUniversalTracker.prototype.trackPageview = function (path, title, options) {
  var pageviewObject

  if (typeof path === 'string') {
    pageviewObject = { page: path }
  }

  if (typeof title === 'string') {
    pageviewObject = pageviewObject || {}
    pageviewObject.title = title
  }

  // Set an options object for the pageview (e.g. transport, sessionControl)
  // https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#transport
  if (typeof options === 'object') {
    pageviewObject = $.extend(pageviewObject || {}, options)
  }

  if (!$.isEmptyObject(pageviewObject)) {
    sendToGa('send', 'pageview', pageviewObject)
  } else {
    sendToGa('send', 'pageview')
  }
}

// https://developers.google.com/analytics/devguides/collection/analyticsjs/events
GoogleAnalyticsUniversalTracker.prototype.trackEvent = function (category, action, options) {
  options = options || {}
  var value
  var evt = {
    hitType: 'event',
    eventCategory: category,
    eventAction: action
  }

  // Label is optional
  if (typeof options.label === 'string') {
    evt.eventLabel = options.label
    delete options.label
  }

  // Value is optional, but when used must be an
  // integer, otherwise the event will be invalid
  // and not logged
  if (options.value || options.value === 0) {
    value = parseInt(options.value, 10)
    if (typeof value === 'number' && !isNaN(value)) {
      options.eventValue = value
    }
    delete options.value
  }

  // Prevents an event from affecting bounce rate
  // https://developers.google.com/analytics/devguides/collection/analyticsjs/events#implementation
  if (options.nonInteraction) {
    options.nonInteraction = 1
  }

  if (typeof options === 'object') {
    $.extend(evt, options)
  }

  sendToGa('send', evt)
}

/*
  https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions
  network – The network on which the action occurs (e.g. Facebook, Twitter)
  action – The type of action that happens (e.g. Like, Send, Tweet)
  target – Specifies the target of a social interaction.
           This value is typically a URL but can be any text.
*/
GoogleAnalyticsUniversalTracker.prototype.trackSocial = function (network, action, target, options) {
  var trackingOptions = {
    'hitType': 'social',
    'socialNetwork': network,
    'socialAction': action,
    'socialTarget': target
  }

  $.extend(trackingOptions, options)

  sendToGa('send', trackingOptions)
}

/*
 https://developers.google.com/analytics/devguides/collection/analyticsjs/cross-domain
 trackerId - the UA account code to track the domain against
 name      - name for the tracker
 domain    - the domain to track
*/
GoogleAnalyticsUniversalTracker.prototype.addLinkedTrackerDomain = function (trackerId, name, domain) {
  sendToGa('create',
           trackerId,
           'auto',
           {'name': name})
  // Load the plugin.
  sendToGa('require', 'linker')
  sendToGa(name + '.require', 'linker')

  // Define which domains to autoLink.
  sendToGa('linker:autoLink', [domain])
  sendToGa(name + '.linker:autoLink', [domain])

  sendToGa(name + '.set', 'anonymizeIp', true)
  sendToGa(name + '.set', 'displayFeaturesTask', null)
  sendToGa(name + '.send', 'pageview')
}

// https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets
GoogleAnalyticsUniversalTracker.prototype.setDimension = function (index, value) {
  sendToGa('set', 'dimension' + index, String(value))
}

function sendToGa () {
  if (typeof global.ga === 'function') {
    global.ga.apply(global, arguments)
  }
}

GOVUK.GoogleAnalyticsUniversalTracker = GoogleAnalyticsUniversalTracker

global.GOVUK = GOVUK

})(window)