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 { unitEditMeasurementsHappyTestCases } from '@/manager/modules/unit/test-cases/unit-edit-measurements-happy-test-cases';
import { verifyUnitMeasurementsCard } from '@/manager/modules/unit/unit-assertions';
import { getUnitCreateData } from '@/manager/modules/unit/unit-factories';
import { test } from '@/manager/modules/unit/unit-fixtures';
import { applyUnitEditMeasurements } from '@/manager/modules/unit/unit-mappers';
import { getUnitTypeCreateData } from '@/manager/modules/unit-type/unit-type-factories';
import { formatId, formatUnit } from '@/shared/utils/formatters';
import { expect } from '@/shared/utils/matchers';

for (const tc of unitEditMeasurementsHappyTestCases) {
  test(tc.description, async ({ createUnit, createUnitType, unitDetailsPage }) => {
    const unitType = await createUnitType(getUnitTypeCreateData());
    const unit = await createUnit(getUnitCreateData(unitType, tc.initialOptions));
    const newUnit = applyUnitEditMeasurements(unit, tc.changes);

    const id = formatId(unit.id);
    const area = formatUnit(newUnit.measurements.area, 'm²');
    const width = formatUnit(newUnit.measurements.width, 'cm');
    const depth = formatUnit(newUnit.measurements.depth, 'cm');

    await unitDetailsPage.goto(unit.id);

    const newDetailsPage = await test.step('edit unit measurements', async () => {
      const dialog = await unitDetailsPage.openUnitEditMeasurementsDialog();
      return dialog.edit(tc.changes);
    });

    await test.step('verify new measurements on details page', () =>
      verifyUnitMeasurementsCard(newDetailsPage.measurementsCard, newUnit.measurements));

    await test.step('verify new measurements on list page', async () => {
      const listPage = await newDetailsPage.returnToUnitListPage();
      await listPage.searchTextField.fill(id);
      await expect(listPage.dataTable.getRows()).toHaveCount(1);
      await expectDataTableTextColumnToHaveText(listPage.dataTable, unitTableColumnTestIds.area, area);
      await expectDataTableTextColumnToHaveText(listPage.dataTable, unitTableColumnTestIds.width, width);
      await expectDataTableTextColumnToHaveText(listPage.dataTable, unitTableColumnTestIds.depth, depth);
    });
  });
}
