import { AbstractControl, ValidatorFn } from '@angular/forms';
import { Anstallningsform, Omfattning } from '@msfa-models/slutredovisning.model';
import { SlutredovisningFormStep0WorkErrors } from './slutredovisning-form-step0-work-errors.model';
import { SlutredovisningFormStep0WorkFormData } from './slutredovisning-form-step0-work.model';

export class SlutredovisningFormStep0WorkValidator {
  static slutredovisningFormStep0WorkIsValid(): ValidatorFn {
    return (c: AbstractControl): SlutredovisningFormStep0WorkErrors => {
      let errors: SlutredovisningFormStep0WorkErrors = {};
      const {
        yrkesomrade,
        yrkesgrupp,
        anstallningsform,
        annatAnstallningComment,
        omfattning,
        omfattningPercent,
      } = c.value as SlutredovisningFormStep0WorkFormData;

      if (!yrkesomrade) {
        errors = {
          ...errors,
          yrkesomrade: 'Yrkesområde måste väljas',
        };
      }
      if (yrkesomrade && !yrkesgrupp) {
        errors = {
          ...errors,
          yrkesgrupp: 'Yrkesgrupp måste väljas',
        };
      }
      if (!anstallningsform) {
        errors = {
          ...errors,
          anstallningsform: 'Anställningsform måste väljas',
        };
      } else if (anstallningsform === Anstallningsform.Annat && !annatAnstallningComment) {
        errors = {
          ...errors,
          annatAnstallningComment: 'Beskrivning av annat är obligatorisk om "annat" är vald under anställningsform',
        };
      }
      if (!omfattning) {
        errors = {
          ...errors,
          omfattning: 'Omfattning måste väljas',
        };
      } else if (omfattning === Omfattning.Deltid) {
        if (omfattningPercent === undefined || omfattningPercent === null) {
          errors = {
            ...errors,
            omfattningPercent: 'Anställningens omfattning i procent är obligatoriskt',
          };
        } else if (omfattningPercent < 1) {
          errors = {
            ...errors,
            omfattningPercent: 'Anställningens omfattning i procent får inte vara mindre än 1% om deltid har valts',
          };
        } else if (omfattningPercent > 99) {
          errors = {
            ...errors,
            omfattningPercent: 'Anställningens omfattning i procent får inte vara mer än 99% om deltid har valts',
          };
        }
      }

      return errors;
    };
  }
}
