package com.airlock.iam.admin.infrastructure;

import ch.ergon.restal.jsonapi.document.data.ResourceIdentifier;
import ch.ergon.restal.jsonapi.document.request.ToManyRelationshipDocument;
import com.airlock.iam.base.api.domain.model.validation.GenericError;
import com.airlock.iam.base.api.domain.model.validation.ValidationResult;
import com.airlock.iam.base.api.domain.model.validation.ValidatorError;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import org.apache.commons.lang3.StringUtils;

public final class RelationshipDocumentValidator {
   private RelationshipDocumentValidator() {
   }

   public static ValidationResult validateRequestDocument(ToManyRelationshipDocument document, String expectedType) {
      List<ResourceIdentifier> identifiers = document.getData();
      List<ValidatorError> errors = new ArrayList<>();
      IntStream.range(0, identifiers.size()).forEach(index -> {
         ResourceIdentifier identifier = identifiers.get(index);
         if (StringUtils.isBlank(identifier.getId())) {
            errors.add(idRequiredError(index));
         }

         String actualType = identifier.getType();
         if (StringUtils.isBlank(actualType)) {
            errors.add(typeError(index, GenericError.REQUIRED));
         } else if (!actualType.equals(expectedType)) {
            errors.add(typeError(index, GenericError.INVALID_VALUE));
         }
      });
      return errors.isEmpty() ? ValidationResult.valid() : ValidationResult.invalid(errors);
   }

   private static ValidatorError idRequiredError(int index) {
      return ValidatorError.validatorError("/data[" + index + "]/id", GenericError.REQUIRED);
   }

   private static ValidatorError typeError(int index, GenericError error) {
      return ValidatorError.validatorError("/data[" + index + "]/type", error);
   }
}
