text: import { computed } from '@ember/object';
  import { equal } from '@ember/object/computed';
  import Model from 'ember-data/model';
  import attr from 'ember-data/attr';
  import { hasMany } from 'ember-data/relationships';
  import { fragment, fragmentArray } from 'ember-data-model-fragments/attributes';
  import shortUUIDProperty from '../utils/properties/short-uuid';
  import ipParts from '../utils/ip-parts';
  
  export default Model.extend({
    // Available from list response
    name: attr('string'),
    datacenter: attr('string'),
    isDraining: attr('boolean'),
    schedulingEligibility: attr('string'),
    status: attr('string'),
    statusDescription: attr('string'),
    shortId: shortUUIDProperty('id'),
    modifyIndex: attr('number'),
  
    // Available from single response
    httpAddr: attr('string'),
    tlsEnabled: attr('boolean'),
    attributes: fragment('node-attributes'),
    meta: fragment('node-attributes'),
    resources: fragment('resources'),
    reserved: fragment('resources'),
    drainStrategy: fragment('drain-strategy'),
  
    isEligible: equal('schedulingEligibility', 'eligible'),
  
    address: computed('httpAddr', function() {
      return ipParts(this.get('httpAddr')).address;
    }),
  
    port: computed('httpAddr', function() {
      return ipParts(this.get('httpAddr')).port;
    }),
  
    isPartial: computed('httpAddr', function() {
      return this.get('httpAddr') == null;
    }),
  
    allocations: hasMany('allocations', { inverse: 'node' }),
  
    drivers: fragmentArray('node-driver'),
    events: fragmentArray('node-event'),
  
    detectedDrivers: computed('drivers.@each.detected', function() {
      return this.get('drivers').filterBy('detected');
    }),
  
    unhealthyDrivers: computed('detectedDrivers.@each.healthy', function() {
      return this.get('detectedDrivers').filterBy('healthy', false);
    }),
  
    unhealthyDriverNames: computed('unhealthyDrivers.@each.name', function() {
      return this.get('unhealthyDrivers').mapBy('name');
    }),
  
    // A status attribute that includes states not included in node status.
    // Useful for coloring and sorting nodes
    compositeStatus: computed('status', 'isEligible', function() {
      return this.get('isEligible') ? this.get('status') : 'ineligible';
    }),
  });
  