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

import com.airlock.iam.configeditor.shared.domain.IamModuleConfigRoot;
import com.airlock.iam.plugin.framework.application.configuration.DefaultPluginConfiguration;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import java.util.Objects;
import java.util.Set;

public class RemovePluginConfigurationCommand implements ConfigEditorCommand {
   private final DefaultPluginConfiguration pluginConfiguration;
   private final boolean removeChildPluginConfigurations;
   private final boolean removeContainedPluginConfigurations;

   public RemovePluginConfigurationCommand(
      MutablePluginConfiguration pluginConfiguration, boolean removeChildPluginConfigurations, boolean removeContainedPluginConfigurations
   ) {
      this.pluginConfiguration = (DefaultPluginConfiguration)pluginConfiguration;
      Objects.requireNonNull(pluginConfiguration, "pluginConfiguration must not be null");
      Objects.requireNonNull(this.pluginConfiguration.getOwner(), "pluginConfiguration is not owned by a PluginConfigurationDictionary");
      this.removeChildPluginConfigurations = removeChildPluginConfigurations;
      this.removeContainedPluginConfigurations = removeContainedPluginConfigurations;
   }

   @Override
   public void execute() {
      if (this.removeContainedPluginConfigurations) {
         this.pluginConfiguration
            .getOwner()
            .removePluginConfigurationAndUnusedContainedPlugins(
               IamModuleConfigRoot.getRootPluginDisplayNames(), Set.of(this.pluginConfiguration), this.removeChildPluginConfigurations
            );
      } else {
         this.pluginConfiguration.getOwner().removePluginConfiguration(this.pluginConfiguration, this.removeChildPluginConfigurations, false);
      }
   }
}
