import { AbstractControl, ValidatorFn } from '@angular/forms';
import {
  ActivityFormErrors,
  PeriodiskRedovisningFormActivity,
  PeriodiskRedovisningFormData,
  PeriodiskRedovisningFormErrors,
} from './periodisk-redovisning-form.model';

export class PeriodiskRedovisningValidator {
  static periodiskRedovisningIsValid(): ValidatorFn {
    return (c: AbstractControl): PeriodiskRedovisningFormErrors => {
      let errors: PeriodiskRedovisningFormErrors;

      const { noActivitiesHasBeenConducted, activities } = c.value as PeriodiskRedovisningFormData;
      if (noActivitiesHasBeenConducted && activities.filter(activity => activity.isSelected).length > 0) {
        errors = {
          ...errors,
          activitiesMismatch:
            'Ifall kryssrutan "Deltagaren har inte deltagit i några aktiviteter denna period" är förbockad får inga aktiviteter vara valda.',
        };
      } else if (
        noActivitiesHasBeenConducted !== true &&
        activities.filter(activity => activity.isSelected).length === 0
      ) {
        errors = {
          ...errors,
          activitiesMismatch:
            'Ifall inga aktiviteter är valda ska "Deltagaren har inte deltagit i några aktiviteter denna period" vara förbockad.',
        };
      }

      return errors;
    };
  }

  static activityIsValid(): ValidatorFn {
    return (c: AbstractControl): ActivityFormErrors => {
      let errors: ActivityFormErrors;
      const controlValue = c.value as PeriodiskRedovisningFormActivity;

      const { performedRemotely, performedPhysically, isSelected, hours } = controlValue;

      if (isSelected && !performedPhysically && !performedRemotely) {
        errors = {
          ...errors,
          locationCheckboxes: 'Minst en plats måste väljas',
        };
      }

      const isValidHours = hours?.length > 0 && Number.isInteger(+hours) && +hours >= 0 && +hours <= 200;

      if (isSelected && !isValidHours) {
        errors = {
          ...errors,
          hours: 'Antal timmar måste vara ett heltal mellan 0 och 200',
        };
      }

      return errors;
    };
  }
}
