// ==========================================================================
// Project:   CoreTools.Target
// Copyright: ©2011 Apple Inc.
// ==========================================================================
/*globals CoreTools */

/** @class

  Describes a target in the build system.

  @extends SC.Record
*/
CoreTools.Target = SC.Record.extend(
/** @scope CoreTools.Target.prototype */ {

  primaryKey: "name",

  /**
    Kind of target.
  */
  kind: SC.Record.attr(String),

  /**
    Name of target.  This is also the primary key.
  */
  name: SC.Record.attr(String),

  /**
    Parent of target.  Only non-null for nested targets.
  */
  parent: SC.Record.toOne("CoreTools.Target"),

  /**
    URL to use to load tests.
  */
  testsUrl: SC.Record.attr(String, { key: "link_tests" }),

  /**
    URL to use to load the app.  If no an app, returns null
  */
  appUrl: function() {
    return (this.get('kind') === 'app') ? CoreTools.attachUrlPrefix(this.get('name')) : null;
  }.property('kind', 'name').cacheable(),

  /**
    The isExpanded state.  Defaults to NO on load.
  */
  isExpanded: SC.Record.attr(Boolean, { defaultValue: NO }),

  /**
    Children of this target.  Computed by getting the loaded targets
  */
  children: function() {
    var store = this.get('store'),
        query = CoreTools.TARGETS_QUERY,
        ret   = store.find(query).filterProperty('parent', this);

    if (ret) ret = ret.sortProperty('kind', 'displayName');
    return (ret && ret.get('length')>0) ? ret : null ;
  }.property().cacheable(),

  /**
    Display name for this target
  */
  displayName: function() {
    var name = (this.get('name') || '(unknown)').split('/');
    return name[name.length-1];
  }.property('name').cacheable(),

  /**
    The icon to display.  Based on the type.
  */
  targetIcon: function() {
    var ret = 'sc-icon-document-16';
    switch(this.get('kind')) {
      case "framework":
        ret = 'sc-icon-folder-16';
        break;

      case "app":
        ret = 'sc-icon-options-16';
        break;
    }
    return ret ;
  }.property('kind').cacheable(),

  /**
    This is the group key used to display.  Will be the kind unless the item
    belongs to the sproutcore target.
  */
  sortKind: function() {
    if (this.get('name') === '/sproutcore') return null;
    var parent = this.get('parent');
    if (parent && (parent.get('name') === '/sproutcore')) return 'sproutcore';
    else return (this.get('kind') || 'unknown').toLowerCase();
  }.property('kind', 'parent').cacheable(),


  testsQuery: function() {
    return SC.Query.remote(CoreTools.Test, { url: this.get('testsUrl') });
  }.property('testsUrl').cacheable(),

  /**
    Returns all of the tests associated with this target by fetching the
    testsUrl.
  */
  tests: function() {
    return this.get('store').find(this.get('testsQuery'));
  }.property('testsQuery').cacheable()

}) ;

CoreTools.TARGETS_QUERY = SC.Query.remote(CoreTools.Target);
