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

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.configeditor.ConfigEditorApplication;
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.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Notification.Type;
import com.vaadin.v7.ui.TextField;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Set;

public class NewContextDialog extends Window {
   private final TextField identifier;
   private ConfigurationContext context;

   @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "See ALIAM-15315")
   public NewContextDialog() {
      this.configureMainWindow();
      VerticalLayout vl = new VerticalLayout();
      this.identifier = new TextField("Identifier");
      this.identifier.setWidth("100%");
      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(this::createButtonClick);
      createButton.setClickShortcut(13, new int[0]);
      createButton.addStyleName("primary");
      Button cancelButton = new Button("Cancel");
      cancelButton.setId("cancelButton");
      cancelButton.addClickListener(this::cancelButtonClick);
      hl.addComponent(cancelButton);
      hl.addComponent(createButton);
      hl.setComponentAlignment(createButton, Alignment.MIDDLE_RIGHT);
      vl.addComponent(hl);
      this.setContent(vl);
      this.identifier.focus();
   }

   public void cancelButtonClick(ClickEvent event) {
      UI.getCurrent().removeWindow(this);
   }

   public void createButtonClick(ClickEvent event) {
      String identifierValue = (String)this.identifier.getValue();
      if (!this.hasRequiredValues(identifierValue)) {
         Notification.show("Required values are missing.", Type.HUMANIZED_MESSAGE);
      } else if (!this.isContextIdentifierUnique(identifierValue)) {
         Notification.show("Context identifier already exists.", Type.HUMANIZED_MESSAGE);
      } else {
         this.context = ConfigurationContext.configurationContext(identifierValue);
         UI.getCurrent().removeWindow(this);
      }
   }

   public ConfigurationContext getConfigurationContext() {
      return this.context;
   }

   private void configureMainWindow() {
      this.setWidth(300.0F, Unit.PIXELS);
      this.setCaption("Create new configuration context");
      this.setResizable(false);
      this.setModal(true);
   }

   private boolean hasRequiredValues(String identifierValue) {
      return identifierValue != null && !identifierValue.isEmpty();
   }

   private boolean isContextIdentifierUnique(String identifierValue) {
      for (ConfigurationContext aContext : this.getAllContexts()) {
         if (aContext.getIdentifier() != null && aContext.getIdentifier().equals(identifierValue)) {
            return false;
         }
      }

      return true;
   }

   private Set<ConfigurationContext> getAllContexts() {
      return ((ConfigEditorApplication)UI.getCurrent()).getConfigurationDictionary().getConfigurationContexts();
   }
}
