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

import com.vaadin.server.Sizeable.Unit;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Button.ClickEvent;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang3.Strings;

public class ConfirmationDialog extends Window {
   private static final String OK_BUTTON_CAPTION = "OK (Continue)";
   private static final String CANCEL_BUTTON_CAPTION = "Cancel";
   private static final int DEFAULT_FIELD_WIDTH = 350;
   private final Button okButton;
   private final Button cancelButton;
   private final Label content;
   private boolean confirmed;
   private boolean cancelled;

   public ConfirmationDialog() {
      this("", "", "OK (Continue)", "Cancel");
   }

   @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "See ALIAM-15315")
   public ConfirmationDialog(String title, String message, String ok, String cancel) {
      this.setWidth(400.0F, Unit.PIXELS);
      this.setCaption(title);
      this.setModal(true);
      this.setResizable(false);
      VerticalLayout vl = new VerticalLayout();
      this.content = new Label(message, ContentMode.HTML);
      this.content.setWidth(100.0F, Unit.PERCENTAGE);
      vl.addComponent(this.content);
      HorizontalLayout hl = new HorizontalLayout();
      hl.setWidth(100.0F, Unit.PERCENTAGE);
      this.okButton = new Button(ok);
      this.okButton.addClickListener(this::okButtonClick);
      this.okButton.setId("primaryButton");
      this.okButton.setClickShortcut(13, new int[0]);
      if (Strings.CI.equals(ok, "Delete")) {
         this.okButton.addStyleName("button-delete");
      } else {
         this.okButton.addStyleName("primary");
      }

      this.cancelButton = new Button(cancel);
      this.cancelButton.setId("cancelButton");
      this.cancelButton.addClickListener(this::cancelButtonClick);
      hl.addComponent(this.cancelButton);
      hl.setComponentAlignment(this.cancelButton, Alignment.MIDDLE_LEFT);
      hl.addComponent(this.okButton);
      hl.setComponentAlignment(this.okButton, Alignment.MIDDLE_RIGHT);
      this.setCancelState();
      vl.addComponent(hl);
      this.setContent(vl);
      this.okButton.focus();
      UI.getCurrent().addWindow(this);
   }

   public void setTitle(String title) {
      this.setCaption(title);
   }

   public void setMessage(String message) {
      this.content.setValue(message);
   }

   public ConfirmationDialog setConfirmButtonText(String text) {
      this.okButton.setCaption(text);
      return this;
   }

   public ConfirmationDialog setCancelButtonText(String text) {
      this.cancelButton.setCaption(text);
      return this;
   }

   public void cancelButtonClick(ClickEvent event) {
      this.setCancelState();
      this.close();
   }

   public void okButtonClick(ClickEvent event) {
      this.setConfirmedState();
      this.close();
   }

   public boolean isConfirmed() {
      return this.confirmed;
   }

   public boolean isCancelled() {
      return this.cancelled;
   }

   private void setCancelState() {
      this.cancelled = true;
      this.confirmed = false;
   }

   private void setConfirmedState() {
      this.confirmed = true;
      this.cancelled = false;
   }
}
