_ = require('lodash')
animatedScrollTo = require('animated-scrollto')
marker = require('./marker.coffee')

is_open_jaw = (segments) ->
  return true if segments.length > 2
  if segments.length is 2
    return (_.first(segments).origin != _.last(segments).destination) or
        (_.first(segments).destination != _.last(segments).origin)
  false

module.exports =
  min: (collection) ->
    minimal = collection[0]
    for val in collection.slice(1)
      minimal = val if val < minimal
    minimal

  max: (collection) ->
    maximal = collection[0]
    for val in collection.slice(1)
      maximal = val if val > maximal
    maximal

  generate_id: -> (0|Math.random()*9e6).toString(36)

  is_ie: navigator.appName == 'Microsoft Internet Explorer'
  is_ff: navigator.userAgent.toLowerCase().indexOf('firefox') != -1

  get_ie_version: ->
    version = -1
    ua = navigator.userAgent
    re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})")
    if re.exec(ua) != null
      version = parseFloat( RegExp.$1 )
    return version

  page_is_visible: ->
    !!!(document.hidden || document.webkitHidden)

  transition_events_supported: ->
    @page_is_visible() && _.any(['webkitTransition', 'MozTransition', 'OTransition', 'transition'], (t) -> !_.isUndefined(document.body.style[t]))

  scroll_to_top: (positionY, speed) ->
    use_html = @is_ie || @is_ff
    scroll_element = if use_html then document.getElementsByTagName('html')[0] else document.body
    animatedScrollTo(scroll_element, positionY, speed)

  is_open_jaw: is_open_jaw

  key_codes:
    esc: 27
    tab: 9
  clean_node: (node) ->
    node.removeChild(child) while(child = node.firstChild)

  filters_state_by_params: (params) ->
    filters_state = {}
    if !is_open_jaw(params.segments) && params.segments[0].origin_city_iata && params.segments[0].origin_city_iata != params.segments[0].origin
      _.extend(filters_state, {departure_airports: [params.segments[0].origin]})

    if !is_open_jaw(params.segments) && params.segments[0].destination_city_iata && params.segments[0].destination_city_iata != params.segments[0].destination
      _.extend(filters_state, {arrival_airports: [params.segments[0].destination]})

    filters_state

  ticket_signature: _.memoize((ticket) ->
    signs = []
    for segment in ticket.segment
      for flight in segment.flight
        parts = flight['departure_date'].split('-')
        signs.push(parts[2] + parts[1] + flight['operating_carrier'] + flight['number'].toString())
    _.sortBy(signs).join('')
  , (ticket) -> ticket.sign)

  build_calendar_deeplink: (params, marker_suffix) ->
    day_diff = (first, second) ->
      (second - first) / (1000 * 60 * 60 * 24)

    # str_date = '2015-09-03'
    to_date = (str_date) ->
      date_parts = str_date.split('-')
      new Date(+date_parts[0], +date_parts[1] - 1, +date_parts[2])

    MIN_TRIP_DURATION = 1
    MAX_TRIP_DURATION = 30
    URL = 'http://www.aviasales.ru/calendar'

    depart_parts = params.segments[0].date.split('-')
    depart_parts[2] = '01'
    marker_parts = marker.get().split('.')
    marker_parts[2] = marker_suffix
    result =
      'origin_iata': params.segments[0].origin
      'destination_iata': params.segments[0].destination
      'depart_months[]': depart_parts.join('-')
      'one_way': true
      'marker': marker_parts.join('.')
    if params.segments.length > 1
      result.one_way = false
      duration = day_diff(to_date(params.segments[0].date), to_date(params.segments[1].date))
      result.min_trip_duration = if duration - 1 >= MIN_TRIP_DURATION then duration - 1 else MIN_TRIP_DURATION
      result.max_trip_duration = if duration + 1 > MAX_TRIP_DURATION then MAX_TRIP_DURATION else duration + 1

    param_string = _.map(result, (val, key) -> "#{key}=#{val}").join('&')
    "#{URL}?#{param_string}"
