text: import Ember from 'ember';
  import Component from '@ember/component';
  import { inject as service } from '@ember/service';
  import { computed } from '@ember/object';
  import { task, timeout } from 'ember-concurrency';
  
  export default Component.extend({
    token: service(),
    statsTrackersRegistry: service('stats-trackers-registry'),
  
    classNames: ['primary-metric'],
  
    // One of Node, Allocation, or TaskState
    resource: null,
  
    // cpu or memory
    metric: null,
  
    'data-test-primary-metric': true,
  
    // An instance of a StatsTracker. An alternative interface to resource
    tracker: computed('trackedResource', 'type', function() {
      const resource = this.get('trackedResource');
      return this.get('statsTrackersRegistry').getTracker(resource);
    }),
  
    type: computed('resource', function() {
      const resource = this.get('resource');
      return resource && resource.constructor.modelName;
    }),
  
    trackedResource: computed('resource', 'type', function() {
      // TaskStates use the allocation stats tracker
      return this.get('type') === 'task-state'
        ? this.get('resource.allocation')
        : this.get('resource');
    }),
  
    metricLabel: computed('metric', function() {
      const metric = this.get('metric');
      const mappings = {
        cpu: 'CPU',
        memory: 'Memory',
      };
      return mappings[metric] || metric;
    }),
  
    data: computed('resource', 'metric', 'type', function() {
      if (!this.get('tracker')) return [];
  
      const metric = this.get('metric');
      if (this.get('type') === 'task-state') {
        // handle getting the right task out of the tracker
        const task = this.get('tracker.tasks').findBy('task', this.get('resource.name'));
        return task && task[metric];
      }
  
      return this.get(`tracker.${metric}`);
    }),
  
    reservedAmount: computed('resource', 'metric', 'type', function() {
      const metricProperty = this.get('metric') === 'cpu' ? 'reservedCPU' : 'reservedMemory';
  
      if (this.get('type') === 'task-state') {
        const task = this.get('tracker.tasks').findBy('task', this.get('resource.name'));
        return task[metricProperty];
      }
  
      return this.get(`tracker.${metricProperty}`);
    }),
  
    chartClass: computed('metric', function() {
      const metric = this.get('metric');
      const mappings = {
        cpu: 'is-info',
        memory: 'is-danger',
      };
  
      return mappings[metric] || 'is-primary';
    }),
  
    poller: task(function*() {
      do {
        this.get('tracker.poll').perform();
        yield timeout(100);
      } while (!Ember.testing);
    }),
  
    didReceiveAttrs() {
      if (this.get('tracker')) {
        this.get('poller').perform();
      }
    },
  
    willDestroy() {
      this.get('poller').cancelAll();
      this.get('tracker.signalPause').perform();
    },
  });
  