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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.application.configuration.masking.StringMaskingConfig;
import jakarta.inject.Inject;
import org.apache.commons.lang3.StringUtils;

@LogicForConfig(StringMaskingConfig.class)
public final class StringMaskingImpl implements StringMasking {
   private final StringMaskingConfig config;

   @Inject
   public StringMaskingImpl(StringMaskingConfig config) {
      this.config = config;
   }

   @Override
   public String mask(String value) {
      if (value == null) {
         return null;
      }

      int visibleStart = this.config.getVisibleStart();
      int visibleEnd = this.config.getVisibleEnd();
      if (visibleStart + visibleEnd >= value.length()) {
         return value;
      }

      String start = StringUtils.substring(value, 0, visibleStart);
      String masked = StringUtils.substring(value, visibleStart, value.length() - visibleEnd);
      String end = StringUtils.substring(value, value.length() - visibleEnd, value.length());
      return start.concat(this.config.getMaskingCharacter().repeat(masked.length())).concat(end);
   }
}
