moment          = require('moment')
_               = require('lodash')
dispatcher      = require('../../common/js/dispatcher')
dom_delegate    = require('dom-delegate')
scroll_handler  = require('../../common/js/scroll_handler.coffee')
animations      = require('../../common/js/animations.coffee')
utils           = require('../../common/js/utils.coffee')
styles_modifier = require('../../common/js/styles_modifier.coffee')
visibility    = require('../../common/js/visibility.coffee')
metrics         = require('../../common/js/metrics.coffee')
HelpLayout      = require('../../common/js/help.js')

current_form_type = 'form_simple'

help_layout = null

should_show_informer = ->
  current_form_type is 'form_openjaw'

layout = (body_el) ->
  delegate = dom_delegate(body_el)
  results_wrapper = body_el.querySelector('.js-results-inner-wrapper')
  left_filters = body_el.querySelector('.js-filters')
  system_messages = body_el.querySelector('.js-system-messages')
  progress_bar = body_el.querySelector('.js-progress-bar-container')
  preroll = body_el.querySelector('.js-preroll')
  search_results = body_el.querySelector('.js-search-results')
  tickets = body_el.querySelector('.results-add-container')
  left_column = body_el.querySelector('.js-left-column')
  right_column = body_el.querySelector('.js-right-column')
  left_column_banner = body_el.querySelector('.js-banners-container')
  old_search_link = body_el.querySelector('.js-old-search-link')
  fake_ticket = body_el.querySelector('.js-fake-ticket')
  sorting = body_el.querySelector('.js-sorting')
  form_container = body_el.querySelector('.js-form')
  form_extra_row = body_el.querySelector('.js-form-extra-row')
  informer_container = body_el.querySelector('.js-informer-container')
  expired_search_plate = body_el.querySelector('.js-expired-search-plate')
  top_filter_container = body_el.querySelector('.js-filters-container')
  header = body_el.querySelector('.js-header')
  sticky_informer = body_el.querySelector('.js-sticky-informer')


  # STICKY INFORMER
  shadow_scroll_value = 30

  progress_bar_scroll_value = 65

  tickets_received = false

  in_search = false
  sticky_progress = false

  _last_search_params = {}

  dispatcher.on('start_search', (e, {request_id, params, filters_state})->
    visibility.show(expired_search_plate)
    in_search = true
    _last_search_params = _.extend({}, params)

    styles_modifier(body_el).add('overflow-hidden')
    help_layout = new HelpLayout(results_wrapper) if not help_layout

    visibility
      .show(progress_bar)
      .show(preroll)
      .disable(sorting)
      .show(fake_ticket)
      .disable(left_filters)
      .hide(right_column)
      .hide(old_search_link)
      .hide(system_messages)
      .show(left_filters)
      .hide(expired_search_plate)
    tickets_received = false

    if should_show_informer() or utils.is_open_jaw(params.segments)
      visibility
        .show(informer_container)
        .hide(form_container)

    styles_modifier(header).add('search-active')
    styles_modifier(sticky_informer).remove('expired')
  )

  # TRANSITION EVENTS
  animation_end_event = animations.get_animation_event_name(progress_bar, true)

  delegate.on(animation_end_event, ".#{styles_modifier().mutate_class_name('hide-with-opacity')}", (event, el)->
    styles_modifier(el).add('hidden')
  )

  shadow_scroll_value = 0

  dispatcher.on('wrong_search_dates', ->
    visibility.show(system_messages)
  )

  delegate.on('click', ".js-old-search-link", (event, event_target) ->
    path = "http://legacy.search.aviasales.ru#{document.location.pathname}"
    event_target.setAttribute('href', path)
    metrics.reach_goal('LEGACY_SEARCH_LINK_CLICK')
  )

  # Click informer to show hidden form
  delegate.on('click', '.js-informer-container', (event, event_target) ->
    visibility
      .hide(informer_container)
      .show(form_container)
      .show(form_extra_row)
  )

  window.addEventListener 'scroll', (e) ->
    scrollTop = e.pageY || document.documentElement.scrollTop || window.pageYOffset
    if scrollTop >= progress_bar_scroll_value
      return unless in_search
      return if sticky_progress
      styles_modifier(progress_bar).add('sticky')
      styles_modifier(sticky_informer).add('sticky')
      sticky_progress = true
    else
      return unless sticky_progress
      styles_modifier(progress_bar).remove('sticky')
      styles_modifier(sticky_informer).remove('sticky')
      sticky_progress = false

  scroll_handler(null, (e)->
    scrollTop = e.pageY || document.documentElement.scrollTop || window.pageYOffset
    if scrollTop > shadow_scroll_value
      styles_modifier(left_filters).add('filters-shadow')
      if current_form_type != 'form_openjaw'
        styles_modifier(top_filter_container).add('filters-on-top')

      if should_show_informer()
        visibility
          .hide(form_container)
          .show(informer_container)
    else
      styles_modifier(body_el.querySelector('.js-form-inner-wrap')).remove('form-shadow')
      styles_modifier(left_filters).remove('filters-shadow')
      if current_form_type != 'form_openjaw'
        styles_modifier(top_filter_container).remove('filters-on-top')
  , 0)

  dispatcher.on('first_tickets_arrived', (event, {request_id}) ->
    visibility
      .show(left_column_banner)
      .show(right_column)
      .enable(left_filters)
      .enable(sorting)
      .hide(preroll)
    styles_modifier(body_el).remove('overflow-hidden')
    tickets_received = true
  )

  delegate.on('click', ".js-informer-restart-search-trigger", ->
    ga_event('update_expired');
    dispatcher.send('start_search', {request_id: utils.generate_id(), params: _last_search_params}, 'layout_manager')
  )

  dispatcher.on('form_switched', (event, form_type) ->
    current_form_type = form_type
  )
  dispatcher.on('products_updated', (event, {request_id, products}) ->
    if products.length > 0
      visibility
        .show(tickets)
        .show(sorting)
        .hide(system_messages)
    else
      visibility
        .hide(tickets, true)
        .hide(sorting, true)
        .show(system_messages)

    if tickets_received and products.length == 0
      visibility.show(system_messages)
  )

  dispatcher.on('search_finished', (event, {request_id}) ->
    in_search = false
    visibility
      .hide(progress_bar, true)
      .hide(preroll)
      .hide(fake_ticket)
      .show(old_search_link)
    styles_modifier(left_column).add('slide-up')
    styles_modifier(header).remove('search-active')
    if !tickets_received
      visibility
        .show(left_column_banner)
        .show(right_column)
        .hide(sorting)
        .hide(fake_ticket)
        .show(system_messages)
      dispatcher.send('search_not_started')

    help_layout.depulse().desaturate()
  )

  dispatcher.on('help_tooltip_toggled', (event, opened, tooltip) ->
    _.forEach(help_layout.get(), (question) -> visibility.toggle(question, !opened) unless tooltip.target == question)

    if opened
      visibility.disable(results_wrapper)

    else
      visibility.enable(results_wrapper)
  )

  dispatcher.on('search_not_started', ->
    if body_el.querySelector('.js-first-input')
      body_el.querySelector('.js-first-input').focus()
  )

  dispatcher.on('search_failed', ->
    in_search = false
    if tickets_received
      visibility.hide(progress_bar)
    else
      visibility
        .hide(search_results)
        .hide(preroll)
        .hide(right_column)
        .hide(sorting)
        .hide(left_column)
        .hide(progress_bar)
        .show(system_messages)
    styles_modifier(body_el).remove('overflow-hidden')
    styles_modifier(header).remove('search-active')
  )
  dispatcher.on('banner_rendered', (event, position)->
    if (position == "/68258039/120x600-AS" || position == "/68258039/160x600-AS")
      visibility.show(left_column)
  )

  dispatcher.on('search_expired', ->
    visibility.show(expired_search_plate)
    styles_modifier(sticky_informer).add('expired')
  )

  filters_and_form_sticky_appear_scroll_value = 100

  set_banner_position = (scrollTop) ->
    if scrollTop > filters_and_form_sticky_appear_scroll_value
      styles_modifier(left_column).add('fixed-column')
    else
      styles_modifier(left_column).remove('fixed-column')

  banner_scroll = (e) ->
    scrollTop = e.pageY || document.documentElement.scrollTop || window.pageYOffset
    styles_modifier(left_filters).toggle('filters-shadow', scrollTop > shadow_scroll_value)
    set_banner_position(scrollTop)

  scroll_handler(banner_scroll, banner_scroll, 0)

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

module.exports = layout
