utils = require('../../common/js/utils.coffee')
styles_modifier = require('../../common/js/styles_modifier.coffee')
_ = require('lodash')
dispatcher = require('../../common/js/dispatcher')
window.googletag = window.googletag || {cmd: []}
settings = require("../../../config/settings").settings

window._init_google_tag(window, document, 'script', 'dataLayer', settings.google_tag_manager)

after_render_cb = {}
initialized_slots = {}

pub = false

on_banner_rendered = (name) -> dispatcher.send('banner_rendered', name)

target_params = (params, distance = 0)->
  targeting_params =
    dest_ctry: params.segments[0].destination_country
    trp_cls: {'Y': 0, 'C': 1}[params.trip_class]
    dest_city: params.segments[0].destination
    dest_airpt: params.segments[0].original_destination
    dest_nm: params.segments[0].destinationname
    orgn_ctry: params.segments[0].origin_country
    orgn_city: params.segments[0].origin
    orgn_airpt: params.segments[0].original_origin
    orgn_nm: params.segments[0].originname
    distance: distance if distance > 0
    adt: params.passengers.adults
    cld: params.passengers.children
    inf: params.passengers.infants
    ddate: params.segments[0].date.replace(/-/g, '')
    rdate: if params.segments.length > 1 then params.segments[1].date.replace(/-/g, '') else ''
    vld_car: params.carier
    d_stops: params.depart_stops_count
    r_stops: params.return_stops_count
  result = {}
  _.each(targeting_params, (value, key) ->
    result[key] = value if value
  )
  result

call_callbacks = (slotname)->
  fn(slotname) for name, fn of after_render_cb

googletag.cmd.push(->
  googletag.pubads().addEventListener 'slotRenderEnded', (event) -> call_callbacks(event.slot.i or event.slot.w)
)
rendered_slots = {}

setup_tag = (name, search_params, city_distance = 0, element_id, banner_size, callback = ->)->
  googletag.cmd.push(->
    _search_params = target_params(search_params, city_distance)
    googletag.pubads().setTargeting(key, value + '') for key, value of _search_params
  )
  unless after_render_cb[name]
    after_render_cb[name] = callback

  googletag.cmd.push(->
    if _.isUndefined(rendered_slots[element_id])
      size_class = "banner-#{banner_size.join('x')}"
      styles_modifier(document.querySelector("##{element_id}")).add(size_class)
      rendered_slots[element_id] = googletag.defineSlot(name, banner_size, element_id).setCollapseEmptyDiv(true, true)
      .addService(googletag.pubads())
      googletag.enableServices()
      googletag.display(element_id)
    else
      googletag.pubads().refresh([rendered_slots[element_id]])
      call_callbacks(name)
  )

gtm =
  setup_tag: setup_tag
  target_params: target_params
  on_banner_rendered: on_banner_rendered

module.exports = gtm
