_                   = require('lodash')
dispatcher          = require('../../common/js/dispatcher')
delegate            = require('dom-delegate')
sorter              = require('../request/sorter.coffee')
filter              = require('../request/filter.coffee')
utils               = require('../../common/js/utils.coffee')
animations          = require('../../common/js/animations.coffee')
metrics             = require('../../common/js/metrics.coffee')
filters             = require('../../common/js/filters.coffee')
ticket_helpers      = require('../../common/js/ticket.coffee')
monkberry           = require('monkberry')

monkberry.mount require './sorting.monk'

module.exports = (sorting_elem) ->

  model =
    request_id: null
    sorting: 'price'
    tickets: []

  state =
    selected: 'price'
    open: false
    label: null
    active_tab: 'all'

  translations =
    price: __('sorting.price')
    duration: __('sorting.duration')
    earliest_depart: __('sorting.earliest_depart')
    latest_depart: __('sorting.latest_depart')
    stops: __('sorting.stops')

  state.label = translations.price

  view = monkberry.render('sorting')
  view.update state
  sorting_elem.appendChild(view.createDocument())

  event_delegate = delegate(sorting_elem)

  send_sorting_status = ->
    dispatcher.send('sort_order_updated', {
      request_id: model.request_id
      sort_order: model.sorting
    }, 'sorting')

  dispatcher.on 'tickets_updated', (event, {request_id, tickets}) ->
    model.request_id = request_id

  event_delegate.on('click', '.js-sorting-button', (event, event_target) ->
    state.open = !state.open
    view.update state
  )

  event_delegate.on('click', '.js-tickets-tab', (event, event_target) ->
    state.active_tab = event_target.data('tab')
    ga_goal = 'tab_' + state.active_tab
    ga_event(ga_goal)
    view.update state
  )

  document.addEventListener('click', (event, event_target) ->
    if !event.target.closest('.js-sorting')
      state.open = false
      view.update state
  )

  event_delegate.on('click', '.js-sorting-item', (event, event_target) ->
    sort_by = event_target.getAttribute('data-sort')
    model.sorting = sort_by
    state.selected = sort_by
    state.label = translations[sort_by]
    state.open = false

    msg = if sort_by == 'price'
      'SORT_BY_PRICE_CLICK'
    else if sort_by == 'duration'
      'SORT_BY_TOTAL_DURATION_CLICK'
    else if sort_by == 'earliest_depart'
      'SORT_BY_EARLIEST_DEPART_CLICK'
    else if sort_by == 'latest_depart'
      'SORT_BY_LATEST_DEPART_CLICK'
    else if sort_by == 'stops'
      'SORT_BY_STOPS_CLICK'
    metrics.reach_goal(msg, {"search_finished": model.search_finished})

    ga_goal = 'sort_by_' + sort_by
    ga_event(ga_goal)

    view.update(state)

    send_sorting_status()
  )

  ga_event = (goal) ->
    ga('common.send', 'event', 's_sorting', 'click', goal);
    ga('local.send', 'event', 's_sorting', 'click', goal);
