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.airlock.iam.plugin.framework.misc.config.PluginConfigurationDictionary;
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.Label;
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.ComboBox;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Set;

public class DeleteContextDialog extends Window {
   private final ComboBox contexts;
   private ConfigurationContext context;

   @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "See ALIAM-15315")
   public DeleteContextDialog() {
      this.setWidth(300.0F, Unit.PIXELS);
      this.setCaption("Delete a configuration context");
      this.setModal(true);
      this.setResizable(false);
      VerticalLayout vl = new VerticalLayout();
      ConfigEditorApplication configEditorApplication = (ConfigEditorApplication)UI.getCurrent();
      PluginConfigurationDictionary dict = configEditorApplication.getConfigurationDictionary();
      Set<ConfigurationContext> allContextsExceptDefault = dict.getConfigurationContexts();
      allContextsExceptDefault.remove(ConfigurationContext.defaultContext());
      Set<ConfigurationContext> deletableContexts = dict.getDeletableContexts();
      this.contexts = new ComboBox("Context");
      if (deletableContexts.isEmpty()) {
         vl.addComponent(new Label("No contexts to delete."));
      } else {
         vl.addComponent(new Label("Select the context to be deleted."));
         this.contexts.setWidth("100%");
         this.contexts.setRequired(true);
         this.contexts.setNullSelectionAllowed(false);

         for (ConfigurationContext currentContext : deletableContexts) {
            this.contexts.addItem(currentContext);
         }

         vl.addComponent(this.contexts);
         this.contexts.focus();
      }

      HorizontalLayout hl = new HorizontalLayout();
      hl.setWidth("100%");
      Button deleteButton = new Button("Delete");
      deleteButton.setId("primaryButton");
      deleteButton.addClickListener(this::deleteButtonClick);
      deleteButton.setClickShortcut(13, new int[0]);
      deleteButton.addStyleName("button-delete");
      Button cancelButton = new Button("Cancel");
      cancelButton.setId("cancelButton");
      cancelButton.addClickListener(this::cancelButtonClick);
      hl.addComponent(cancelButton);
      hl.addComponent(deleteButton);
      hl.setComponentAlignment(deleteButton, Alignment.MIDDLE_RIGHT);
      vl.addComponent(hl);
      this.setContent(vl);
      this.contexts.focus();
   }

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

   public void deleteButtonClick(ClickEvent event) {
      ConfigurationContext selectedContext = (ConfigurationContext)this.contexts.getValue();
      if (selectedContext == null) {
         Notification.show("Required values are missing.", Type.HUMANIZED_MESSAGE);
      } else {
         this.context = selectedContext;
         UI.getCurrent().removeWindow(this);
      }
   }

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