package com.airlock.iam.common.domain.model.claims;

import com.airlock.iam.common.api.domain.model.claims.ClaimsValidationResult;
import com.airlock.iam.common.api.domain.model.claims.InvalidClaim;
import com.google.common.annotations.VisibleForTesting;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nonnull;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

public final class ClaimsValidationResultImpl implements ClaimsValidationResult {
   private Set<InvalidClaim> invalidClaims;

   @Override
   public boolean isValid() {
      return this.invalidClaims.isEmpty();
   }

   public static ClaimsValidationResult claimsValidResult() {
      return new ClaimsValidationResultImpl(Collections.emptySet());
   }

   public static ClaimsValidationResult claimsInvalidResult(@Nonnull Set<InvalidClaim> invalidClaims) {
      Validate.notEmpty(invalidClaims, "invalidClaims must not be empty", new Object[0]);
      return new ClaimsValidationResultImpl(invalidClaims);
   }

   @VisibleForTesting
   static String invalidClaimsAsString(@Nonnull ClaimsValidationResult result) {
      return result.invalidClaims().stream().map(InvalidClaim::getMessage).collect(Collectors.joining("; "));
   }

   public static String invalidClaimsAsString(@Nonnull List<ClaimsValidationResult> results) {
      return results.stream().map(ClaimsValidationResultImpl::invalidClaimsAsString).filter(StringUtils::isNotBlank).collect(Collectors.joining("; "));
   }

   @SuppressFBWarnings(justification = "generated code")
   public ClaimsValidationResultImpl(Set<InvalidClaim> invalidClaims) {
      this.invalidClaims = invalidClaims;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Set<InvalidClaim> invalidClaims() {
      return this.invalidClaims;
   }
}
