package com.airlock.iam.plugin.configeditor.ui.dialog;

import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Notification.Type;
import com.vaadin.v7.ui.TextField;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;

public class NewEnvironmentDialog extends Window {
   private static final int DEFAULT_FIELD_WIDTH = 300;
   private final TextField identifier;
   private Optional<ConfigurationEnvironment> configurationEnvironment = Optional.empty();

   public NewEnvironmentDialog(Set<ConfigurationEnvironment> existing) {
      this.setWidth(350.0F, Unit.PIXELS);
      this.setCaption("Create new configuration environment");
      this.setResizable(false);
      this.setModal(true);
      VerticalLayout vl = new VerticalLayout();
      this.identifier = new TextField("Identifier");
      this.identifier.setWidth(300.0F, Unit.PIXELS);
      this.identifier.setRequired(true);
      vl.addComponent(this.identifier);
      HorizontalLayout hl = new HorizontalLayout();
      hl.setWidth("100%");
      Button createButton = new Button("Create");
      createButton.setId("primaryButton");
      createButton.addClickListener(event -> {
         String newEnvironmentIdentifier = (String)this.identifier.getValue();
         if (StringUtils.isBlank(newEnvironmentIdentifier)) {
            Notification.show("Required values are missing.", Type.HUMANIZED_MESSAGE);
         } else {
            ConfigurationEnvironment env = ConfigurationEnvironment.configurationEnvironment(newEnvironmentIdentifier);
            if (existing.contains(env)) {
               Notification.show("Configuration environment already exists.", Type.HUMANIZED_MESSAGE);
            } else {
               this.configurationEnvironment = Optional.of(env);
               this.close();
            }
         }
      });
      createButton.setClickShortcut(13, new int[0]);
      createButton.addStyleName("primary");
      hl.addComponent(createButton);
      hl.setComponentAlignment(createButton, Alignment.MIDDLE_RIGHT);
      vl.addComponent(hl);
      this.setContent(vl);
      this.setId("createConfigEnvironmentDialog");
      this.identifier.focus();
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<ConfigurationEnvironment> getConfigurationEnvironment() {
      return this.configurationEnvironment;
   }
}
