package com.airlock.iam.plugin.config.manipulator;

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.framework.misc.config.modification.connect.ConfigConnectModificationItem;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

public record ConnectInfo(
   String sourcePluginId, String destinationPluginId, String destinationProperty, ConfigurationEnvironment environment, ConfigurationContext context
) {
   public static ConnectInfo toConnectInfo(ConfigConnectModificationItem connectModification) {
      return builder()
         .sourcePluginId(connectModification.sourceId())
         .destinationPluginId(connectModification.targetId())
         .destinationProperty(connectModification.targetProperty())
         .environment(ConfigurationEnvironment.configurationEnvironment(connectModification.targetEnv().orElse(null)))
         .context(ConfigurationContext.configurationContext(connectModification.targetContext().orElse(null)))
         .build();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static ConnectInfo.ConnectInfoBuilder builder() {
      return new ConnectInfo.ConnectInfoBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public ConnectInfo.ConnectInfoBuilder toBuilder() {
      return new ConnectInfo.ConnectInfoBuilder()
         .sourcePluginId(this.sourcePluginId)
         .destinationPluginId(this.destinationPluginId)
         .destinationProperty(this.destinationProperty)
         .environment(this.environment)
         .context(this.context);
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class ConnectInfoBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String sourcePluginId;
      @SuppressFBWarnings(justification = "generated code")
      private String destinationPluginId;
      @SuppressFBWarnings(justification = "generated code")
      private String destinationProperty;
      @SuppressFBWarnings(justification = "generated code")
      private ConfigurationEnvironment environment;
      @SuppressFBWarnings(justification = "generated code")
      private ConfigurationContext context;

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

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo.ConnectInfoBuilder sourcePluginId(String sourcePluginId) {
         this.sourcePluginId = sourcePluginId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo.ConnectInfoBuilder destinationPluginId(String destinationPluginId) {
         this.destinationPluginId = destinationPluginId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo.ConnectInfoBuilder destinationProperty(String destinationProperty) {
         this.destinationProperty = destinationProperty;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo.ConnectInfoBuilder environment(ConfigurationEnvironment environment) {
         this.environment = environment;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo.ConnectInfoBuilder context(ConfigurationContext context) {
         this.context = context;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public ConnectInfo build() {
         return new ConnectInfo(this.sourcePluginId, this.destinationPluginId, this.destinationProperty, this.environment, this.context);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ConnectInfo.ConnectInfoBuilder(sourcePluginId="
            + this.sourcePluginId
            + ", destinationPluginId="
            + this.destinationPluginId
            + ", destinationProperty="
            + this.destinationProperty
            + ", environment="
            + this.environment
            + ", context="
            + this.context
            + ")";
      }
   }
}
