package com.airlock.iam.plugin.framework.domain.model;

import com.airlock.iam.plugin.framework.domain.model.property.Property;
import com.google.common.base.Preconditions;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;

public class Plugin {
   public static final Pattern UUID_VALIDATION_PATTERN = Pattern.compile("[a-zA-Z0-9-_.]{1,500}");
   private Optional<String> type = Optional.empty();
   private Optional<String> name = Optional.empty();
   private Optional<String> uuid = Optional.empty();
   private Optional<String> uuidRef = Optional.empty();
   private Optional<String> template = Optional.empty();
   private Optional<String> comment = Optional.empty();
   private final List<Property> properties = new ArrayList<>();

   public Optional<String> getUuid() {
      return this.uuid;
   }

   public void setUuid(String uuid) {
      this.uuid = Optional.ofNullable(uuid);
   }

   public Optional<String> getTemplate() {
      return this.template;
   }

   public void setTemplate(String parentPluginName) {
      this.template = Optional.ofNullable(parentPluginName);
   }

   public Optional<String> getComment() {
      return this.comment;
   }

   public void setComment(String comment) {
      this.comment = Optional.ofNullable(comment);
   }

   public Optional<String> getUuidRef() {
      return this.uuidRef;
   }

   public void setUuidRef(String uuidRef) {
      this.uuidRef = Optional.ofNullable(uuidRef);
   }

   public Optional<String> getType() {
      return this.type;
   }

   public void setType(String type) {
      this.type = Optional.ofNullable(type);
   }

   public Optional<String> getName() {
      return this.name;
   }

   public void setName(String name) {
      this.name = Optional.ofNullable(name);
   }

   public void addProperty(Property property) {
      this.properties.add((Property)Preconditions.checkNotNull(property));
   }

   public void removeProperty(Property property) {
      this.properties.remove(Preconditions.checkNotNull(property));
   }

   public List<Property> getProperties() {
      return List.copyOf(this.properties);
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "Plugin(type="
         + this.getType()
         + ", name="
         + this.getName()
         + ", uuid="
         + this.getUuid()
         + ", uuidRef="
         + this.getUuidRef()
         + ", template="
         + this.getTemplate()
         + ", comment="
         + this.getComment()
         + ", properties="
         + this.getProperties()
         + ")";
   }
}
