import { AbstractControl, ValidatorFn, Validators } from '@angular/forms';
import { UiValidators } from '@ui/validators';

// RFC 5322 Official Standard
const emailRegexPattern = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;

export const emailNotificationValidator: ValidatorFn = (control: AbstractControl) => {
  if (control.parent) {
    const notificationChannel = control.parent.get('selected').value;
    if (notificationChannel & 1) {
      return Validators.required(control) ?? Validators.pattern(emailRegexPattern)(control);
    }
  }

  return null;
};

export const mobileNotificationValidator: ValidatorFn = (control: AbstractControl) => {
  if (control.parent) {
    const notificationChannel = control.parent.get('selected').value;
    if (notificationChannel & 2) {
      return Validators.required(control) ?? UiValidators.phone(control);
    }
  }
  return null;
};
