import { mount } from '@vue/test-utils';
import { describe, it, expect } from 'vitest';
import MFieldGroup from './MFieldGroup.vue';

describe('MFieldGroup component', () => {
  it('should render label correctly', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
      },
    });

    const label = wrapper.find('legend');
    expect(label.exists()).toBe(true);
    expect(label.text()).toBe('Field Label');
  });

  it('should render requirement text if provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        requirementText: 'required',
      },
    });

    const requirementText = wrapper.find('.mc-field__requirement');
    expect(requirementText.exists()).toBe(true);
    expect(requirementText.text()).toBe('(required)');
  });

  it('should not render requirement text if not provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
      },
    });

    const requirementText = wrapper.find('.mc-field__requirement');
    expect(requirementText.exists()).toBe(false);
  });

  it('should render help text if provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        helpText: 'This is some help text.',
      },
    });

    const helpText = wrapper.find('.mc-field__help');
    expect(helpText.exists()).toBe(true);
    expect(helpText.text()).toBe('This is some help text.');
  });

  it('should not render help text if not provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
      },
    });

    const helpText = wrapper.find('.mc-field__help');
    expect(helpText.exists()).toBe(false);
  });

  it('should apply is-valid class when isValid prop is true', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        isValid: true,
        message: 'Valid input',
      },
    });

    expect(wrapper.find('.mc-field__validation-message').classes()).toContain(
      'is-valid',
    );
    expect(wrapper.find('.mc-field__validation-message').text()).toBe(
      'Valid input',
    );
  });

  it('should apply is-invalid class when isInvalid prop is true', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        isInvalid: true,
        message: 'Invalid input',
      },
    });

    expect(wrapper.find('.mc-field__validation-message').classes()).toContain(
      'is-invalid',
    );
    expect(wrapper.find('.mc-field__validation-message').text()).toBe(
      'Invalid input',
    );
  });

  it('should render a validation message only when isValid or isInvalid is true and message is provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        isValid: true,
        message: 'This is a valid input',
      },
    });

    const validationMessage = wrapper.find('.mc-field__validation-message');
    expect(validationMessage.exists()).toBe(true);
    expect(validationMessage.text()).toBe('This is a valid input');
  });

  it('should render the form element passed in the slot', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
      },
      slots: {
        default: '<input type="text" />',
      },
    });

    const input = wrapper.find('input');
    expect(input.exists()).toBe(true);
    expect(input.attributes('type')).toBe('text');
  });

  it('should render validation message when isInvalid is true and message is provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        isInvalid: true,
        message: 'There is an error',
      },
    });

    const validationMessage = wrapper.find('.mc-field__validation-message');
    expect(validationMessage.exists()).toBe(true);
    expect(validationMessage.text()).toBe('There is an error');
  });

  it('should not render validation message when message is not provided', () => {
    const wrapper = mount(MFieldGroup, {
      props: {
        id: 'input-id',
        legend: 'Field Label',
        isValid: true,
      },
    });

    const validationMessage = wrapper.find('.mc-field__validation-message');
    expect(validationMessage.exists()).toBe(false);
  });
});
