/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: MPL-2.0
 */

import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import sinon from 'sinon';
import setupGlimmerComponentFactory from 'nomad-ui/tests/helpers/glimmer-factory';

module('Unit | Component | scale-events-chart', function (hooks) {
  setupTest(hooks);
  setupGlimmerComponentFactory(hooks, 'scale-events-chart');

  hooks.beforeEach(function () {
    this.refTime = new Date();
    this.clock = sinon.useFakeTimers(this.refTime);
  });

  hooks.afterEach(function () {
    this.clock.restore();
    delete this.refTime;
  });

  test('the current date is appended as a datum for the line chart to render', function (assert) {
    const events = [
      { time: new Date('2020-08-02T04:06:00'), count: 2, hasCount: true },
      { time: new Date('2020-08-01T04:06:00'), count: 2, hasCount: true },
    ];

    const chart = this.createComponent({ events });

    assert.equal(chart.data.length, events.length + 1);
    assert.deepEqual(chart.data.slice(0, events.length), events.sortBy('time'));

    const appendedDatum = chart.data[chart.data.length - 1];
    assert.equal(appendedDatum.count, events.sortBy('time').lastObject.count);
    assert.equal(+appendedDatum.time, +this.refTime);
  });

  test('if the earliest annotation is outside the domain of the events, the earliest annotation time is added as a datum for the line chart to render', function (assert) {
    const annotationOutside = [
      { time: new Date('2020-08-01T04:06:00'), hasCount: false, error: true },
      { time: new Date('2020-08-02T04:06:00'), count: 2, hasCount: true },
      { time: new Date('2020-08-03T04:06:00'), count: 2, hasCount: true },
    ];
    const annotationInside = [
      { time: new Date('2020-08-02T04:06:00'), count: 2, hasCount: true },
      { time: new Date('2020-08-02T12:06:00'), hasCount: false, error: true },
      { time: new Date('2020-08-03T04:06:00'), count: 2, hasCount: true },
    ];

    const chart = this.createComponent({ events: annotationOutside });

    assert.equal(chart.data.length, annotationOutside.length + 1);
    assert.deepEqual(
      chart.data.slice(1, annotationOutside.length),
      annotationOutside.filterBy('hasCount')
    );

    const appendedDatum = chart.data[0];
    assert.equal(appendedDatum.count, annotationOutside[1].count);
    assert.equal(+appendedDatum.time, +annotationOutside[0].time);

    chart.args.events = annotationInside;

    assert.equal(chart.data.length, annotationOutside.length);
    assert.deepEqual(
      chart.data.slice(0, annotationOutside.length - 1),
      annotationOutside.filterBy('hasCount')
    );
  });
});
