// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var defineClass = require('./util/define-class');

var Place = require('./place');

var Destination = defineClass({
  publics: {
    getIndex: function() {
      return this.index;
    },

    getPlace: function() {
      return this.place;
    },

    hasPlace: function() {
      return !!this.place;
    },

    setPlace: function(place) {
      var prev = this.place;
      if (!Place.equal(prev, place)) {
        this.place = place;
        this.onPlaceChange(place, prev);
      }
    },

    isSelected: function() {
      return this.selected;
    },

    select: function() {
      if (!this.selected) {
        this.selected = true;
        this.onSelect();
      }
    },

    deselect: function() {
      if (this.selected) {
        this.selected = false;
        this.onDeselect();
      }
    },

    hasNext: function() {
      return this.index < this.list.count() - 1;
    },

    getNext: function() {
      return this.list.get(this.index + 1);
    },

    hasPrevious: function() {
      return this.index > 0;
    },

    getPrevious: function() {
      return this.hasPrevious()? this.list.get(this.index - 1) : null;
    },

    remove: function() {
      this.list.remove(this.index);
    }
  },

  privates: {
    setIndex: function(index) {
      this.index = index;
    }
  },

  events: [
    /**
     * Fired when properties related to the ordering of this destination with
     * respect to other timeline have changed. Such properties include
     * whether this destination is or last and its index number.
     *
     * @param index the new index, which may not have changed. If the index has
     *  not changed, then this event is in response to the destination changing
     *  to or from last.
     */
    'onOrdinalChange',
    /**
     * Fired when the destination has been set to a place, or cleared.
     * @param place the new destination, as a normalized place.
     * @param previous the old destination, as a normalized place.
     */
    'onPlaceChange',
    'onSelect',
    'onDeselect'
  ],

  /**
   * @param list the containing `Destinations` instance.
   * @param index the index within the parent list
   * @param callbacks an object that will be assigned members for utility
   *  callbacks that the caller can use:
   *    <ul>
   *      <li>ordinalChange - fires this destination's `onOrdinalChange` event.
   *    </ul>
   */
  init: function(list, index, callbacks) {
    this.list = list;
    this.selected = false;
    this.index = index;

    callbacks.ordinalChange = this.onOrdinalChange;
    this.onOrdinalChange.add(this.setIndex);
  }
});

module.exports = Destination;