/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2024, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/
import { createOpenMct, resetApplicationState } from '../../utils/testing.js';

describe('The Forms API', () => {
  let openmct;
  let element;

  beforeEach((done) => {
    element = document.createElement('div');
    element.style.display = 'block';
    element.style.width = '1920px';
    element.style.height = '1080px';

    openmct = createOpenMct();
    openmct.on('start', done);

    openmct.startHeadless(element);
  });

  afterEach(() => {
    return resetApplicationState(openmct);
  });

  it('openmct supports form API', () => {
    expect(openmct.forms).not.toBe(null);
  });

  describe('check default form controls exists', () => {
    it('autocomplete', () => {
      const control = openmct.forms.getFormControl('autocomplete');
      expect(control).not.toBe(null);
    });

    it('clock', () => {
      const control = openmct.forms.getFormControl('composite');
      expect(control).not.toBe(null);
    });

    it('datetime', () => {
      const control = openmct.forms.getFormControl('datetime');
      expect(control).not.toBe(null);
    });

    it('file-input', () => {
      const control = openmct.forms.getFormControl('file-input');
      expect(control).not.toBe(null);
    });

    it('locator', () => {
      const control = openmct.forms.getFormControl('locator');
      expect(control).not.toBe(null);
    });

    it('numberfield', () => {
      const control = openmct.forms.getFormControl('numberfield');
      expect(control).not.toBe(null);
    });

    it('select', () => {
      const control = openmct.forms.getFormControl('select');
      expect(control).not.toBe(null);
    });

    it('textarea', () => {
      const control = openmct.forms.getFormControl('textarea');
      expect(control).not.toBe(null);
    });

    it('textfield', () => {
      const control = openmct.forms.getFormControl('textfield');
      expect(control).not.toBe(null);
    });
  });

  it('supports user defined form controls', () => {
    const newFormControl = {
      show: () => {
        console.log('show new control');
      },
      destroy: () => {
        console.log('destroy');
      }
    };
    openmct.forms.addNewFormControl('newFormControl', newFormControl);
    const control = openmct.forms.getFormControl('newFormControl');
    expect(control).not.toBe(null);
    expect(control.show).not.toBe(null);
    expect(control.destroy).not.toBe(null);
  });

  describe('show form on UI', () => {
    let formStructure;

    beforeEach(() => {
      formStructure = {
        title: 'Test Show Form',
        sections: [
          {
            rows: [
              {
                key: 'name',
                control: 'textfield',
                name: 'Title',
                pattern: '\\S+',
                required: false,
                cssClass: 'l-input-lg',
                value: 'Test Name'
              }
            ]
          }
        ]
      };
    });

    it('when container element is provided', (done) => {
      openmct.forms.showCustomForm(formStructure, { element }).catch(() => {
        done();
      });
      const titleElement = element.querySelector('.c-overlay__dialog-title');
      expect(titleElement.textContent).toBe(formStructure.title);

      element.querySelector('.js-cancel-button').click();
    });

    it('when container element is not provided', (done) => {
      openmct.forms.showForm(formStructure).catch(() => {
        done();
      });

      const titleElement = document.querySelector('.c-overlay__dialog-title');
      const title = titleElement.textContent;

      expect(title).toBe(formStructure.title);
      document.querySelector('.js-cancel-button').click();
    });
  });
});
