ticket = require('../../common/js/ticket.coffee')
bench = require('../../common/js/bench.coffee')

PRICE = 'price'
DURATION = 'duration'
RATING = 'rating'

_compare = (a, b) ->
  return 1 if a > b
  return -1 if a < b
  return 0

sortings = {
  price: ([ticket1, proposals1], [ticket2, proposals2]) ->
    _compare(+proposals1[0]['unified_price'], +proposals2[0]['unified_price']) or
      _compare(ticket.duration(ticket1), ticket.duration(ticket2)) or
      _compare(ticket1.sign, ticket2.sign)
  duration: ([ticket1, proposals1], [ticket2, proposals2]) ->
#invert comparison coz true > false
    -_compare(ticket.is_direct(ticket1), ticket.is_direct(ticket2)) or
      (if ticket.is_direct(ticket1) and ticket.is_direct(ticket2) then _compare(ticket.duration(ticket1), ticket.duration(ticket2)) else 0) or
      _compare(ticket1.sign, ticket2.sign)
  earliest_depart: ([ticket1, proposals1], [ticket2, proposals2]) ->
    _compare(ticket.departure_timestamp(ticket1), ticket.departure_timestamp(ticket2)) or
      (if ticket.is_direct(ticket1) and ticket.is_direct(ticket2) then sortings.price([ticket1, proposals1], [ticket2, proposals2]) else 0) or
      _compare(ticket.duration(ticket1), ticket.duration(ticket2)) or
      _compare(ticket1.sign, ticket2.sign)
  latest_depart: ([ticket1, proposals1], [ticket2, proposals2]) ->
    -_compare(ticket.departure_timestamp(ticket1), ticket.departure_timestamp(ticket2)) or
      (if ticket.is_direct(ticket1) and ticket.is_direct(ticket2) then sortings.price([ticket1, proposals1], [ticket2, proposals2]) else 0) or
      _compare(ticket.duration(ticket1), ticket.duration(ticket2)) or
      _compare(ticket1.sign, ticket2.sign)
  stops: ([ticket1, proposals1], [ticket2, proposals2]) ->
    _compare(ticket1.max_stops, ticket2.max_stops) or
      (if ticket.is_direct(ticket1) and ticket.is_direct(ticket2) then sortings.price([ticket1, proposals1], [ticket2, proposals2]) else 0) or
      _compare(ticket.duration(ticket1), ticket.duration(ticket2)) or
      _compare(ticket1.sign, ticket2.sign)
  rating: ([ticket1, proposals1], [ticket2, proposals2]) ->
    _compare(+ticket1.ticket_rating, +ticket2.ticket_rating) or
      _compare(ticket1.sign, ticket2.sign)
}

sort = bench('sort', ((tickets, criteria) ->
  tickets.sort(sortings[criteria])), {tickets: (args) -> args[0].length})

module.exports = {
  criteria: {
    PRICE: PRICE
    DURATION: DURATION
    RATING: RATING
  },
  sort_funcs: sortings
  sort: sort
}
