/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: BUSL-1.1
 */

import Fragment from 'ember-data-model-fragments/fragment';
import { array } from 'ember-data-model-fragments/attributes';
import { attr } from '@ember-data/model';
import { computed } from '@ember/object';
import { replace, nullValue } from 'consul-ui/decorators/replace';

export const schema = {
  Status: {
    allowedValues: ['passing', 'warning', 'critical'],
  },
  Type: {
    allowedValues: ['serf', 'script', 'http', 'tcp', 'ttl', 'docker', 'grpc', 'alias'],
  },
};

export default class HealthCheck extends Fragment {
  @attr('string') Name;
  @attr('string') CheckID;
  // an empty Type means its the Consul serf Check
  @replace('', 'serf') @attr('string') Type;
  @attr('string') Status;
  @attr('string') Notes;
  @attr('string') Output;
  @attr('string') ServiceName;
  @attr('string') ServiceID;
  @attr('string') Node;
  @nullValue([]) @array('string') ServiceTags;
  @attr() Definition; // {}

  // Exposed is only set correct if this Check is accessed via instance.MeshChecks
  // essentially this is a lazy MeshHealthCheckModel
  @attr('boolean') Exposed;

  @computed('ServiceID')
  get Kind() {
    return this.ServiceID === '' ? 'node' : 'service';
  }

  @computed('Type')
  get Exposable() {
    return ['http', 'grpc'].includes(this.Type);
  }
}
