package com.airlock.iam.plugin.configeditor.field;

import com.airlock.iam.plugin.configeditor.ConfigEditorApplication;
import com.airlock.iam.plugin.configeditor.data.PluginConfigurationFormItem;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.airlock.iam.plugin.framework.domain.model.Plugin;
import com.airlock.iam.plugin.framework.misc.config.PluginConfigurationDictionary;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.UI;
import com.vaadin.v7.data.Validator;
import com.vaadin.v7.data.Validator.InvalidValueException;
import com.vaadin.v7.ui.Field;
import com.vaadin.v7.ui.TextField;

public final class PluginIdentifierField {
   private final TextField field = new TextField();

   public PluginIdentifierField(PluginConfigurationFormItem pcfItem) {
      this.field.setWidth(360.0F, Unit.PIXELS);
      this.field.setCaption(null);
      this.field.setDescription("A unique technical identifier used to reference plugins within the configuration and in the CLI.");
      this.field.addValidator(new PluginIdentifierField.IdentifierValidator((MutablePluginConfiguration)pcfItem.getBean(), this.getConfigurationDictionary()));
   }

   private PluginConfigurationDictionary getConfigurationDictionary() {
      return ((ConfigEditorApplication)UI.getCurrent()).getConfigurationDictionary();
   }

   public Field<?> getField() {
      return this.field;
   }

   private record IdentifierValidator(MutablePluginConfiguration pc, PluginConfigurationDictionary dict) implements Validator {
      public void validate(Object value) throws InvalidValueException {
         if (value instanceof String stringValue) {
            String uuid = stringValue.trim();
            boolean isPatternMatch = Plugin.UUID_VALIDATION_PATTERN.matcher(value.toString()).matches();
            if (!isPatternMatch) {
               throw new InvalidValueException(
                  "The ID \""
                     + value
                     + "\" contains unsupported characters or is too long. Allowed characters include letters (a-z, A-Z), numbers (0-9), hyphens (-), underscores (_), and dots (.). Maximum length: 500 characters. On activation the ID is reset to the last valid ID."
               );
            }

            MutablePluginConfiguration existingWithSameUuid = this.dict.getByUuid(uuid);
            if (existingWithSameUuid != null && !this.pc.equals(existingWithSameUuid)) {
               throw new InvalidValueException("The ID \"" + uuid + "\" is already in use.");
            }
         }
      }
   }
}
