import { IBasicStrucElement } from '../page-object/i-page-structure';
import { FormField, IFormField } from '../form-field/form-field';
import { IPageElement } from './page-element';

export class Form implements IPageElement, IBasicStrucElement {
  id = '';

  constructor(public fields: FormField[]) {
  }

  validateDefaultFieldValues(): void {
    this.fields.forEach(f => f.validateDefaultFieldValues());
  }

  public validateFieldsValues(entity: any, fields: Array<FormField> = this.fields) {
    fields.forEach((f: FormField) => {
      if (f.exists) {
        f.validateFieldValue((<any>entity)[f.entityPropertyName!]);
      }
    })
  }

  private canSetFieldValue(formField: FormField) {
    return formField.exists && formField.enabled && formField.visible;
  }

  public setFieldsValues(entity: any, fields: Array<FormField> = this.fields) {
    fields.forEach((f: FormField) => {
      if (this.canSetFieldValue(f)) {
        if (f.entityPropertyName?.includes('.')) {
          f.setValue(this.getFieldValueWithDotInFieldName(entity, f.entityPropertyName!));
        } else {
          let val = (<any>entity)[f.entityPropertyName!];
          f.setValue(val);
        }
      }
    })
  }

  private getFieldValueWithDotInFieldName(entity: any, fieldName: string): string {
    let splitedFieldName = fieldName.split('.');

    if (splitedFieldName.length == 2) {
      return entity[splitedFieldName[0]][splitedFieldName[1]];
    }
    return this.getFieldValueWithDotInFieldName(entity[splitedFieldName[0]], splitedFieldName.slice(1).join('.'));
  }
}
