package com.airlock.iam.common.domain.model.user.profileitems;

import com.airlock.iam.core.misc.persistency.UserIterator;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Objects;
import java.util.regex.Pattern;

public class ExtendedStringProfileItemLogic extends StringProfileItemLogic {
   private final Pattern displayPattern;
   private final String displayReplacement;
   private final Pattern readOnlyPattern;

   protected ExtendedStringProfileItemLogic(
      boolean validateOnlyChangedValues,
      String propertyName,
      boolean optional,
      Pattern validationPattern,
      UserIterator uniquenessChecker,
      boolean checkUniquenessAgainstUsername,
      Pattern displayPattern,
      String displayReplacement,
      boolean modifiable,
      Pattern readOnlyPattern
   ) {
      super(validateOnlyChangedValues, propertyName, optional, modifiable, validationPattern, uniquenessChecker, checkUniquenessAgainstUsername, false);
      this.displayPattern = displayPattern;
      this.displayReplacement = displayReplacement;
      this.readOnlyPattern = readOnlyPattern;
   }

   @Override
   public boolean isModifiable(Object value) {
      if (value != null && this.readOnlyPattern != null) {
         String strValue = Objects.toString(value, "");
         return this.readOnlyPattern.matcher(strValue).matches() ? false : super.isModifiable(value);
      } else {
         return super.isModifiable(value);
      }
   }

   public String transformPersistentValue(Object value) {
      String strValue = Objects.toString(value, "");
      return this.displayPattern != null ? strValue.replaceAll(this.displayPattern.pattern(), this.displayReplacement) : strValue;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder subbuilder() {
      return new ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ExtendedStringProfileItemLogicBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private boolean validateOnlyChangedValues;
      @SuppressFBWarnings(justification = "generated code")
      private String propertyName;
      @SuppressFBWarnings(justification = "generated code")
      private boolean optional;
      @SuppressFBWarnings(justification = "generated code")
      private Pattern validationPattern;
      @SuppressFBWarnings(justification = "generated code")
      private UserIterator uniquenessChecker;
      @SuppressFBWarnings(justification = "generated code")
      private boolean checkUniquenessAgainstUsername;
      @SuppressFBWarnings(justification = "generated code")
      private Pattern displayPattern;
      @SuppressFBWarnings(justification = "generated code")
      private String displayReplacement;
      @SuppressFBWarnings(justification = "generated code")
      private boolean modifiable;
      @SuppressFBWarnings(justification = "generated code")
      private Pattern readOnlyPattern;

      @SuppressFBWarnings(justification = "generated code")
      ExtendedStringProfileItemLogicBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder validateOnlyChangedValues(boolean validateOnlyChangedValues) {
         this.validateOnlyChangedValues = validateOnlyChangedValues;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder propertyName(String propertyName) {
         this.propertyName = propertyName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder optional(boolean optional) {
         this.optional = optional;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder validationPattern(Pattern validationPattern) {
         this.validationPattern = validationPattern;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder uniquenessChecker(UserIterator uniquenessChecker) {
         this.uniquenessChecker = uniquenessChecker;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder checkUniquenessAgainstUsername(boolean checkUniquenessAgainstUsername) {
         this.checkUniquenessAgainstUsername = checkUniquenessAgainstUsername;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder displayPattern(Pattern displayPattern) {
         this.displayPattern = displayPattern;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder displayReplacement(String displayReplacement) {
         this.displayReplacement = displayReplacement;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder modifiable(boolean modifiable) {
         this.modifiable = modifiable;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder readOnlyPattern(Pattern readOnlyPattern) {
         this.readOnlyPattern = readOnlyPattern;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ExtendedStringProfileItemLogic build() {
         return new ExtendedStringProfileItemLogic(
            this.validateOnlyChangedValues,
            this.propertyName,
            this.optional,
            this.validationPattern,
            this.uniquenessChecker,
            this.checkUniquenessAgainstUsername,
            this.displayPattern,
            this.displayReplacement,
            this.modifiable,
            this.readOnlyPattern
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ExtendedStringProfileItemLogic.ExtendedStringProfileItemLogicBuilder(validateOnlyChangedValues="
            + this.validateOnlyChangedValues
            + ", propertyName="
            + this.propertyName
            + ", optional="
            + this.optional
            + ", validationPattern="
            + this.validationPattern
            + ", uniquenessChecker="
            + this.uniquenessChecker
            + ", checkUniquenessAgainstUsername="
            + this.checkUniquenessAgainstUsername
            + ", displayPattern="
            + this.displayPattern
            + ", displayReplacement="
            + this.displayReplacement
            + ", modifiable="
            + this.modifiable
            + ", readOnlyPattern="
            + this.readOnlyPattern
            + ")";
      }
   }
}
