/*****************************************************************************
 * 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.
 *****************************************************************************/
/*
 * This test suite is dedicated to testing the operator status plugin.
 */

import { fileURLToPath } from 'url';

import { expect, test } from '../../../../pluginFixtures.js';

/*

Precondition: Inject Example User, Operator Status Plugins
Verify that user 1 sees updates from user/role 2 (Not possible without openmct-yamcs implementation)

Clear Role Status of single user test
STUB (test.fixme) Rolling through each

*/

test.describe('Operator Status', () => {
  test.beforeEach(async ({ page }) => {
    // FIXME: determine if plugins will be added to index.html or need to be injected
    await page.addInitScript({
      path: fileURLToPath(new URL('../../../../helper/addInitExampleUser.js', import.meta.url))
    });
    await page.addInitScript({
      path: fileURLToPath(new URL('../../../../helper/addInitOperatorStatus.js', import.meta.url))
    });
    await page.goto('./', { waitUntil: 'domcontentloaded' });
    await expect(page.getByText('Select Role')).toBeVisible();
    // Description should be empty https://github.com/nasa/openmct/issues/6978
    await expect(page.locator('.c-message__action-text')).toBeHidden();
    // set role
    await page.getByRole('button', { name: 'Select', exact: true }).click();
    // dismiss role confirmation popup
    await page.getByRole('button', { name: 'Dismiss' }).click();
  });

  // verify that operator status is visible
  test('operator status is visible and expands when clicked', async ({ page }) => {
    await expect(page.locator('div[title="Set my operator status"]')).toBeVisible();
    await page.locator('div[title="Set my operator status"]').click();

    // expect default status to be 'GO'
    await expect(page.locator('.c-status-poll-panel')).toBeVisible();
  });

  test('poll question indicator remains when blank poll set', async ({ page }) => {
    await expect(page.locator('div[title="Set the current poll question"]')).toBeVisible();
    await page.locator('div[title="Set the current poll question"]').click();
    // set to blank
    await page.getByRole('button', { name: 'Update' }).click();

    // should still be visible
    await expect(page.locator('div[title="Set the current poll question"]')).toBeVisible();
  });

  // Verify that user 1 sees updates from user/role 2 (Not possible without openmct-yamcs implementation)
  test('operator status table reflects answered values', async ({ page }) => {
    // user navigates to operator status poll
    const statusPollIndicator = page.locator('div[title="Set my operator status"]');
    await statusPollIndicator.click();

    // get user role value
    const userRole = page.locator('.c-status-poll-panel__user-role');
    const userRoleText = await userRole.innerText();

    // get selected status value
    const selectStatus = page.locator('select[name="setStatus"]');
    await selectStatus.selectOption({ index: 1 });
    const initialStatusValue = await selectStatus.inputValue();

    // open manage status poll
    const manageStatusPollIndicator = page.locator('div[title="Set the current poll question"]');
    await manageStatusPollIndicator.click();
    // parse the table row values
    const row = page.locator(`tr:has-text("${userRoleText}")`);
    const rowValues = await row.innerText();
    const rowValuesArr = rowValues.split('\t');
    const COLUMN_STATUS_INDEX = 1;
    // check initial set value matches status table
    expect(rowValuesArr[COLUMN_STATUS_INDEX].toLowerCase()).toEqual(
      initialStatusValue.toLowerCase()
    );

    // change user status
    await statusPollIndicator.click();
    // FIXME: might want to grab a dynamic option instead of arbitrary
    await page.locator('select[name="setStatus"]').selectOption({ index: 2 });
    const updatedStatusValue = await selectStatus.inputValue();
    // verify user status is reflected in table
    await manageStatusPollIndicator.click();

    const updatedRow = page.locator(`tr:has-text("${userRoleText}")`);
    const updatedRowValues = await updatedRow.innerText();
    const updatedRowValuesArr = updatedRowValues.split('\t');

    expect(updatedRowValuesArr[COLUMN_STATUS_INDEX].toLowerCase()).toEqual(
      updatedStatusValue.toLowerCase()
    );
  });

  test('clear poll button removes poll responses', async ({ page }) => {
    // user navigates to operator status poll
    const statusPollIndicator = page.locator('div[title="Set my operator status"]');
    await statusPollIndicator.click();

    // get user role value
    const userRole = page.locator('.c-status-poll-panel__user-role');
    const userRoleText = await userRole.innerText();

    // get selected status value
    const selectStatus = page.locator('select[name="setStatus"]');
    // FIXME: might want to grab a dynamic option instead of arbitrary
    await selectStatus.selectOption({ index: 1 });
    const initialStatusValue = await selectStatus.inputValue();

    // open manage status poll
    const manageStatusPollIndicator = page.locator('div[title="Set the current poll question"]');
    await manageStatusPollIndicator.click();
    // parse the table row values
    const row = page.locator(`tr:has-text("${userRoleText}")`);
    const rowValues = await row.innerText();
    const rowValuesArr = rowValues.split('\t');
    const COLUMN_STATUS_INDEX = 1;
    // check initial set value matches status table
    expect(rowValuesArr[COLUMN_STATUS_INDEX].toLowerCase()).toEqual(
      initialStatusValue.toLowerCase()
    );

    // clear the poll
    await page.locator('button[title="Clear the previous poll question"]').click();

    const updatedRow = page.locator(`tr:has-text("${userRoleText}")`);
    const updatedRowValues = await updatedRow.innerText();
    const updatedRowValuesArr = updatedRowValues.split('\t');
    const UNSET_VALUE_LABEL = 'Not set';
    expect(updatedRowValuesArr[COLUMN_STATUS_INDEX]).toEqual(UNSET_VALUE_LABEL);
  });

  test.fixme('iterate through all possible response values', async ({ page }) => {
    // test all possible response values for the poll
  });
});
