import { getProductRecurringCreateData } from '@/manager/modules/product/product-factories';
import { test } from '@/manager/modules/product/product-fixtures';
import { applyProductRecurringEditTax } from '@/manager/modules/product/product-mappers';
import { productRecurringEditTaxHappyTestCases } from '@/manager/modules/product/test-cases/product-recurring-edit-tax-happy-test-cases';
import { verifyTaxCard } from '@/manager/modules/ui/tax/tax-assertions';
import { expect } from '@/shared/utils/matchers';

for (const tc of productRecurringEditTaxHappyTestCases) {
  test(tc.description, async ({ createProductRecurring, productRecurringDetailsPage }) => {
    const product = await createProductRecurring(getProductRecurringCreateData(tc.initialOptions));
    const newProduct = applyProductRecurringEditTax(product, tc.changes);

    await productRecurringDetailsPage.goto(product.id);

    await test.step('edit recurring product tax', async () => {
      const dialog = await productRecurringDetailsPage.openTaxEditDialog();
      await dialog.edit(tc.changes);
    });

    await test.step('verify new recurring product tax on details page', async () => {
      await verifyTaxCard(productRecurringDetailsPage.taxCard, newProduct.taxes);
    });
  });
}

test('rejects an edit without all required fields', async ({ createProductRecurring, productRecurringDetailsPage }) => {
  const product = await createProductRecurring(getProductRecurringCreateData());

  await productRecurringDetailsPage.goto(product.id);

  const dialog = await test.step('submit edit with cleared required fields', async () => {
    const editDialog = await productRecurringDetailsPage.openTaxEditDialog();
    await editDialog.b2cTaxAutocomplete.fillWithoutEnter('');
    await editDialog.b2bTaxAutocomplete.fillWithoutEnter('');
    await editDialog.submit();
    return editDialog;
  });

  await test.step('verify errors on form', async () => {
    await expect(dialog.errors).toHaveCountGreaterThan(0);
  });
});
