package com.airlock.iam.flow.shared.domain.model.item;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
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.Validator;
import com.airlock.iam.flow.shared.api.domain.model.item.info.UserDataItemInfo;
import com.airlock.iam.flow.shared.api.domain.model.item.info.UserDataItemInfoFactory;
import com.airlock.iam.flow.shared.application.configuration.item.EnumContextDataItemDefinitionConfig;
import com.google.common.collect.Lists;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nonnull;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

@LogicForConfig(EnumContextDataItemDefinitionConfig.class)
public class EnumContextDataItemDefinition extends ContextDataItemDefinitionBase<String> {
   private final EnumContextDataItemDefinitionConfig config;

   @Inject
   public EnumContextDataItemDefinition(EnumContextDataItemDefinitionConfig config) {
      super(config, Lists.newArrayList(new Validator[]{new EnumContextDataItemDefinition.EnumValidator(config.getContextDataItemName(), config.getValues())}));
      this.config = config;
   }

   @Override
   protected Optional<String> convertInternal(@Nonnull Object value) {
      return Optional.empty();
   }

   @Override
   public UserDataItemInfo<String> getItemInfo(Optional<String> currentValue) {
      return UserDataItemInfoFactory.createEnumDataItemInfo(
         this.getFieldName(), currentValue, this.isRequired(), this.config.getValues(), this.getInputPurpose()
      );
   }

   private static class EnumValidator implements Validator<String> {
      private final String fieldName;
      private final List<String> values;

      public ValidationResult validate(String toValidate) {
         Objects.requireNonNull(toValidate);
         return !this.values.contains(toValidate) ? ValidationResult.singleError(this.fieldName, GenericError.INVALID_VALUE) : ValidationResult.valid();
      }

      @SuppressFBWarnings(justification = "generated code")
      public EnumValidator(String fieldName, List<String> values) {
         this.fieldName = fieldName;
         this.values = values;
      }
   }
}
