_                   = require('lodash')
delegate            = require('dom-delegate')
temple_utils        = require('temple-wat')
feedback_templ      = require('./feedback.temple')
dispatcher          = require('../../common/js/dispatcher')
metrics             = require('../../common/js/metrics.coffee')
styles              = require('../../common/js/styles_modifier.coffee')
google_tag_manager  = require('../google/tag_manager.coffee')

presenter_module = require('./presenter.coffee')
pool = temple_utils.pool(_.extend({}, feedback_templ))

model =
  dicts:
    search_id: {}
    airports: {}
    airlines: {}
    gates: {}
    currencies: {}
  params: {}
  ticket: {}
  proposals: {}
  currency: 'rub'
  search_expired: false
  city_distance: 0

PROPOSAL_COUNT = 3
presenter = presenter_module(model)
module.exports = (element) ->

  event_delegate = delegate(element)

  [el, templ_obj] = pool.get('feedback', presenter.visibility(false))
  document.getElementById('feedback-widget').appendChild(el)

  show = ->
    templ_obj.update(presenter.visibility(true))
    styles(document.body).add('overflow-hidden')
    metrics.reach_goal('FEEDBACK_SHOW_POPUP')

  hide = ->
    templ_obj.update(presenter.visibility(false))
    styles(document.body).remove('overflow-hidden')
    metrics.reach_goal('FEEDBACK_HIDE_POPUP')

  event_delegate.on('click', '.js-feedback-close', hide)
  delegate(document).on('click', '.js-feedback-overlay', hide)

  event_delegate.on('click', '.js-feedback-ticket', (event, event_target) ->
    metrics.reach_goal('FEEDBACK_TICKET_CLICK')
  )

  event_delegate.on('click', '.js-feedback-proposal', (event, event_target) ->
    index = event_target.getAttribute('data-index')

    # Exclude on click only if more than max count
    selected_proposal = model.proposals[index]
    if model.proposals.length > PROPOSAL_COUNT
      model.proposals.splice(index, 1).pop()

    # Fucking magic to save the url we are clicking atm
    _.delay(->
      templ_obj.update(presenter.adapt([model.ticket, model.proposals], selected_proposal))
    200)

    metrics.reach_goal('FEEDBACK_PROPOSAL_CLICK')
  )

  dispatcher.on('start_search', (event, {request_id, params}) ->
    model.params = params
    model.search_id = request_id
  )

  dispatcher.on('search_expired', ->
    hide()
  )

  dispatcher.on('search_id_updated', (event, {request_id, search_id}) ->
    model.dicts.search_id = search_id
  )

  dispatcher.on('gates_updated', (event, {request_id: request_id, gates: gates}) ->
    model.dicts.gates = gates
  )

  dispatcher.on('currencies_updated', (event, {request_id, currencies}) ->
    model.dicts.currencies = currencies
  )

  dispatcher.on('currency_updated', (event, currency) ->
    model.currency = currency
  )

  dispatcher.on('airports_updated', (event, {request_id: request_id, airports: airports}) ->
    model.dicts.airports = airports
  )

  dispatcher.on('airlines_updated', (event, {request_id: request_id, airlines: airlines}) ->
    model.dicts.airlines = airlines
  )

  dispatcher.on 'city_distance_updated', (event, {request_id, city_distance}) ->
    model.city_distance = city_distance

  display_feedback_banner = ->
    google_tag_manager.setup_tag("/68258039/600x180-Feedback-ASnew", model.params, model.city_distance,
      'stranniy_popup', [600, 180], google_tag_manager.on_banner_rendered)

  dispatcher.on('ticket_clicked', (event, {ticket, proposal_index}) ->
    selected_proposal = null
    display_feedback_banner()
    [model.ticket, model.proposals] = _.cloneDeep(ticket)

    if !_.isNull(proposal_index)
      selected_proposal = model.proposals.splice(proposal_index, 1).pop()

    templ_obj.update(presenter.adapt(ticket, selected_proposal))
    show()
  )
