package com.airlock.iam.oauth2.application.configuration.clientauthentication;

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.PropertyConstraintViolationException;
import com.airlock.iam.plugin.api.exception.PropertyTypeMismatchException;
import com.airlock.iam.plugin.api.valuereader.StringPropertyValueReader;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang3.StringUtils;

public final class OAuth2HeaderClientSecretConfigValidator {
   private final String clientSecretFormatField;
   private final String clientSecretPlaceholder;

   public void checkExactlyOneSecretPlaceholder(PluginConfiguration config, ConfigurationEnvironment env, ConfigurationContext context) throws PropertyTypeMismatchException, PropertyConstraintViolationException {
      String clientSecretValue = StringPropertyValueReader.effectiveStringConfigValue(config, this.clientSecretFormatField, env, context);
      if (!StringUtils.isBlank(clientSecretValue)) {
         if (StringUtils.countMatches(clientSecretValue, this.clientSecretPlaceholder) != 1) {
            throw new PropertyConstraintViolationException(
               this.clientSecretFormatField,
               config,
               env,
               context,
               "There must be exactly one occurrence of \"" + this.clientSecretPlaceholder + "\" in the \"Client Secret Value\" or the field must be blank."
            );
         }
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2HeaderClientSecretConfigValidator(String clientSecretFormatField, String clientSecretPlaceholder) {
      this.clientSecretFormatField = clientSecretFormatField;
      this.clientSecretPlaceholder = clientSecretPlaceholder;
   }
}
