_          = require('lodash')
system_messages_temple = require('./system_messages.temple')
dom_delegate = require('dom-delegate')
dispatcher = require('../../common/js/dispatcher')
temple_utils = require('temple-wat')
metrics = require('../../common/js/metrics.coffee')
pool = temple_utils.pool(system_messages_temple)


preroll_type_classes =
  wait_screen: ''
  error_page: 'preroll-container--error'

error_types =
  wrong_dates:
    message_type_class: "#{preroll_type_classes.error_page} #{preroll_type_classes.error_page}__wrong_dates"
    message: __('errors.wrong_dates.message')
    description:
      text: __('errors.wrong_dates.description')
    additional_texts: false
    call2action: false
  bad_search_params:
    message_type_class: "#{preroll_type_classes.error_page} #{preroll_type_classes.error_page}__bad_search_params"
    message: __('errors.bad_search_params.message')
    description:
      text: __('errors.bad_search_params.description')
    additional_texts: false
    call2action: false
  search_failed:
    message_type_class: "#{preroll_type_classes.error_page} #{preroll_type_classes.error_page}__search_failed"
    message: __('errors.search_failed.message')
    description:
      text: __('errors.search_failed.description')
    additional_texts: false
    call2action: false
  empty_tickets:
    message_type_class: "#{preroll_type_classes.error_page} #{preroll_type_classes.error_page}__empty_tickets"
    message: __('errors.empty_tickets.message')
    description:
      text: __('errors.empty_tickets.description')
    additional_texts: __('errors.empty_tickets.additional_texts')
    call2action: false
  filtered_all_tickets:
    message_type_class: "#{preroll_type_classes.error_page}__filtered_all_tickets"
    message: __('errors.filtered_all_tickets.message')
    description:
      text: __('errors.filtered_all_tickets.description')
    additional_texts: false
    call2action:
      trigger_caption: __('errors.filtered_all_tickets.relax_filters_message')
      trigger_event: 'reset_filters'

  example_error:
    message_type_class: "#{preroll_type_classes.error_page} #{preroll_type_classes.error_page}__example_error"
    message: __('errors.filtered_all_tickets.message')
    description:
      text: __('errors.filtered_all_tickets.description')
    call2action:
      trigger_caption: __('errors.filtered_all_tickets.relax_filters_message')
      trigger_event: 'foo-event'


message = (container_el)->
  [messages_el, messages_obj] = pool.get('system_messages', {
    call2action: false
    message_type: ''
    message: ''
  })
  container_el.appendChild(messages_el)

  delegate = dom_delegate(messages_el)

  tickets_received = false

  set_error = (params)->
    messages_obj.update({
      message: params.message
      message_type: params.message_type_class
      description:
        description: params.description
        description_align_class: if params.additional_texts then 'align-left' else 'align-center'
      call2action: params.call2action
      additional_texts: _.map(params.additional_texts, (value, key) ->
        {text: value}
      )
    })

  dispatcher.on('wrong_search_dates', ->
    set_error(error_types.wrong_dates)
    metrics.reach_goal('WRONG_SEARCH_DATES')
  )

  dispatcher.on('start_search', (event, params) ->
    tickets_received = false
  )

  dispatcher.on('search_failed', (event, {request_id, data}) ->
    set_error(if data?.status == 400 then error_types.bad_search_params else error_types.search_failed)
  )

  dispatcher.on('search_finished', ->
    referrer = document.referrer
    if !tickets_received
      set_error(error_types.empty_tickets)
      metrics.reach_goal('NO_TICKETS_RECEIVED', {referrer: referrer, params: window._location})
  )

  dispatcher.on('tickets_updated', (event, {request_id, tickets})->
    if tickets_received and tickets.length == 0
      set_error(error_types.filtered_all_tickets)
  )

  dispatcher.on('first_tickets_arrived', ->
    tickets_received = true
  )

  delegate.on('click', '[data-trigger]', (event, element) ->
    event_name = element.getAttribute('data-trigger')
    dispatcher.send(event_name)
  )


module.exports = message
