import { AggregationMapping, FieldMapping } from '@admin-client/reporting-shared';
import { AggregationMappingFormE2EComponent } from '../../components/aggregation-mapping/aggregation-mapping-form.e2e.component';
import {
  AggregationMappingE2EComponent,
  AggregationMappingListItemE2EComponent,
} from '../../components/aggregation-mapping/aggregation-mapping.e2e.component';
import { haveText, haveValue } from '../../support/cypress.util';

export class E2EAggregationMappingVerifier {
  private component: AggregationMappingE2EComponent = new AggregationMappingE2EComponent();
  private formComponent: AggregationMappingFormE2EComponent = new AggregationMappingFormE2EComponent();

  public verifyFieldMapping(fieldMapping: FieldMapping, index: number): void {
    haveValue(this.formComponent.getSourceMappingFieldInput(index), fieldMapping.sourcePath);
    haveValue(this.formComponent.getTargetMappingFieldInput(index), fieldMapping.targetPath);
  }

  public verifyForm(aggregationMapping: AggregationMapping): void {
    haveValue(this.formComponent.getNameInput(), aggregationMapping.name);
    haveValue(this.formComponent.getFormEngineInput(), aggregationMapping.formIdentifier.formEngineName);
    haveValue(this.formComponent.getFormIdInput(), aggregationMapping.formIdentifier.formId);

    aggregationMapping.mappings.forEach((fieldMapping, index) => {
      this.verifyFieldMapping(fieldMapping, index);
    });
  }

  public verifyAggregationMappingInList(aggregationMapping: AggregationMapping): void {
    const listItem: AggregationMappingListItemE2EComponent = this.component.getListItem(aggregationMapping.name);
    haveText(listItem.getName(), aggregationMapping.name);
    haveText(listItem.getFormEngineName(), aggregationMapping.formIdentifier.formEngineName);
    haveText(listItem.getFormId(), aggregationMapping.formIdentifier.formId);
  }
}