import { getInsuranceCreateData } from '@/manager/modules/insurance/insurance-factories';
import { test } from '@/manager/modules/insurance/insurance-fixtures';
import { applyInsuranceEditTax } from '@/manager/modules/insurance/insurance-mappers';
import { insuranceEditTaxHappyTestCases } from '@/manager/modules/insurance/test-cases/insurance-edit-tax-happy-test-cases';
import { verifyTaxCard } from '@/manager/modules/ui/tax/tax-assertions';
import { expect } from '@/shared/utils/matchers';

for (const tc of insuranceEditTaxHappyTestCases) {
  test(tc.description, async ({ createInsurance, insuranceDetailsPage }) => {
    const insurance = await createInsurance(getInsuranceCreateData(tc.initialOptions));
    const newInsurance = applyInsuranceEditTax(insurance, tc.changes);

    await insuranceDetailsPage.goto(insurance.id);

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

    await test.step('verify new insurance tax on details page', () =>
      verifyTaxCard(insuranceDetailsPage.taxCard, newInsurance.taxes));
  });
}

test('rejects an edit without all required fields', async ({ createInsurance, insuranceDetailsPage }) => {
  const insurance = await createInsurance(getInsuranceCreateData());

  await insuranceDetailsPage.goto(insurance.id);

  const dialog = await test.step('submit edit with cleared required fields', async () => {
    const editDialog = await insuranceDetailsPage.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);
  });
});
