/**
 * Copyright (c) HashiCorp, Inc.
 * SPDX-License-Identifier: BUSL-1.1
 */
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, settled, find, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
const SHARED_STYLES = {
  success: {
    icon: 'check-circle-fill',
    class: 'hds-alert--color-success',
  },
  warning: {
    icon: 'alert-triangle-fill',
    class: 'hds-alert--color-warning',
  },
};
module('Integration | Component | alert-inline', function (hooks) {
  setupRenderingTest(hooks);
  test('it renders alert message for each @color arg', async function (assert) {
    const COLORS = {
      ...SHARED_STYLES,
      neutral: {
        icon: 'info-fill',
        class: 'hds-alert--color-neutral',
      },
      highlight: {
        icon: 'info-fill',
        class: 'hds-alert--color-highlight',
      },
      critical: {
        icon: 'alert-diamond-fill',
        class: 'hds-alert--color-critical',
      },
    };
    const { neutral } = COLORS; // default color
    await render(hbs``);
    assert.dom('[data-test-inline-error-message]').hasText('some very important alert');
    assert.dom(`[data-test-icon="${neutral.icon}"]`).exists('renders default icon');
    assert.dom('[data-test-inline-alert]').hasClass(neutral.class, 'renders default class');
    // assert deprecated @type arg values map to expected color
    for (const type in COLORS) {
      this.color = type;
      const color = COLORS[type];
      await render(hbs``);
      assert.dom(`[data-test-icon="${color.icon}"]`).exists(`@color="${type}" renders icon: ${color.icon}`);
      assert
        .dom('[data-test-inline-alert]')
        .hasClass(color.class, `@color="${type}" renders class: ${color.class}`);
    }
  });
  test('it renders alert color for each deprecated @type arg', async function (assert) {
    const OLD_TYPES = {
      ...SHARED_STYLES,
      info: {
        icon: 'info-fill',
        class: 'hds-alert--color-highlight',
      },
      danger: {
        icon: 'alert-diamond-fill',
        class: 'hds-alert--color-critical',
      },
    };
    // assert deprecated @type arg values map to expected color
    for (const type in OLD_TYPES) {
      this.type = type;
      const color = OLD_TYPES[type];
      await render(hbs``);
      assert
        .dom(`[data-test-icon="${color.icon}"]`)
        .exists(`deprecated @type="${type}" renders icon: ${color.icon}`);
      assert
        .dom('[data-test-inline-alert]')
        .hasClass(color.class, `deprecated @type="${type}" renders class: ${color.class}`);
    }
  });
  test('it mimics loading when message changes', async function (assert) {
    this.message = 'some very important alert';
    await render(hbs`
    
    `);
    assert
      .dom('[data-test-inline-error-message]')
      .hasText('some very important alert', 'it renders original message');
    this.set('message', 'some changed alert!!!');
    await waitUntil(() => find('[data-test-icon="loading"]'));
    assert.ok(find('[data-test-icon="loading"]'), 'it shows loading icon when message changes');
    await settled();
    assert
      .dom('[data-test-inline-error-message]')
      .hasText('some changed alert!!!', 'it shows updated message');
  });
});