import { expectDataTableTextColumnToHaveText } from '@/manager/modules/ui/data-table/data-table-assertions';
import { unitTableColumnTestIds } from '@/manager/modules/ui/data-table/data/data-table-column-test-ids';
import { unitChangeStatusHappyTestCases } from '@/manager/modules/unit/test-cases/unit-change-status-happy-test-cases';
import { getUnitCreateData } from '@/manager/modules/unit/unit-factories';
import { test } from '@/manager/modules/unit/unit-fixtures';
import { getUnitTypeCreateData } from '@/manager/modules/unit-type/unit-type-factories';
import { expectSingleLocatorToHaveText } from '@/manager/shared/utils/expect-utils';
import { formatId } from '@/shared/utils/formatters';
import { expect } from '@/shared/utils/matchers';

for (const tc of unitChangeStatusHappyTestCases) {
  test(tc.description, async ({ createUnit, createUnitType, unitDetailsPage }) => {
    const unitType = await createUnitType(getUnitTypeCreateData());
    const unit = await createUnit(getUnitCreateData(unitType, { status: tc.initialStatus }));
    const id = formatId(unit.id);

    await unitDetailsPage.goto(unit.id);

    await test.step('change unit status', () => unitDetailsPage.moveTo(tc.newStatus));

    await test.step('verify new status on details page', async () => {
      await expectSingleLocatorToHaveText(unitDetailsPage.status, tc.newStatus);
    });

    await test.step('verify new status on list page', async () => {
      const listPage = await unitDetailsPage.returnToUnitListPage();
      await listPage.searchTextField.fill(id);
      await expect(listPage.dataTable.getRows()).toHaveCount(1);
      await expectDataTableTextColumnToHaveText(listPage.dataTable, unitTableColumnTestIds.status, tc.newStatus);
    });
  });
}
