/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */

package org.apache.openaz.xacml.admin.view.windows;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.apache.openaz.xacml.admin.util.AdminNotification;
import org.apache.openaz.xacml.api.pap.PDP;
import org.apache.openaz.xacml.api.pap.PDPGroup;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Buffered.SourceException;
import com.vaadin.data.Validator;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.validator.RegexpValidator;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

import elemental.events.KeyboardEvent.KeyCode;

public class EditPDPWindow extends Window {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private Button buttonSave;
	@AutoGenerated
	private TextArea textDescription;
	@AutoGenerated
	private TextField textName;
	@AutoGenerated
	private TextField textId;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private final EditPDPWindow self = this;
	private final PDP pdp;
	private final List<PDPGroup> groups;
	private boolean isSaved = false;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 * @param pdp 
	 */
	public EditPDPWindow(PDP pdp, List<PDPGroup> list) {
		buildMainLayout();
		//setCompositionRoot(mainLayout);
		setContent(mainLayout);
		//
		// Save data
		//
		this.pdp = pdp;
		this.groups = list;
		//
		// Initialize
		//
		this.initializeText();
		this.initializeButton();
		//
		// Keyboard short
		//
		this.setCloseShortcut(KeyCode.ESC);
		this.buttonSave.setClickShortcut(KeyCode.ENTER);
		//
		//  Focus
		//
		this.textId.focus();
	}
	
	protected void initializeText() {
		//
		// Initialize values
		//
		if (this.pdp != null) {
			this.textId.setValue(this.pdp.getId());
			this.textName.setValue(this.pdp.getName());
			this.textDescription.setValue(this.pdp.getDescription());
		}
		//
		//
		//
		this.textId.setRequiredError("You must enter a valid id for the PDP.");
		this.textId.setNullRepresentation("");
		this.textId.addValidator(new RegexpValidator("[\\w=,]", false, "Please enter a valid URL with no whitespace or \"=\" or \",\" characters."));
		this.textId.addValidator(new Validator() {
			private static final long serialVersionUID = 1L;

			@Override
			public void validate(Object value) throws InvalidValueException {
				//
				// Cannot be null
				//
				if (value == null || value.toString().length() == 0) {
					throw new InvalidValueException("ID cannot be null.");
				}
				//
				// Make sure its a valid URL
				//
				try {
					new URL(value.toString());
				} catch (MalformedURLException e) {
					throw new InvalidValueException("The PDP URL '" + value.toString() + "' is not a valid URL: '" + e.getMessage() +"'");
				}
			}
		});
		//
		//
		//
		this.textName.setNullRepresentation("");
		this.textName.addValidator(new Validator() {
			private static final long serialVersionUID = 1L;

			@Override
			public void validate(Object value) throws InvalidValueException {
				//
				// If the value is null, set it to the id
				//
				if (value == null || value.toString().length() == 0) {
					return;
				}
			}
		});
		//
		//
		//
		this.textDescription.setNullRepresentation("");
	}
	
	protected void initializeButton() {
		this.buttonSave.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void buttonClick(ClickEvent event) {
				try {
					//
					// Do a commit
					//
					self.textName.commit();
					self.textId.commit();
					self.textDescription.commit();
					//
					// Should be a string, but to be safe
					//
					String id = self.textId.getValue();
					String name = self.textName.getValue();
					if (name == null || name.isEmpty()) {
						self.textName.setValue(id);
						name = id;
					}
					//
					// ID must be unique.
					// Also the Name must be unique AND not match any existing IDs
					// because user uses the NAME to identify this PDP on the browser window, not the ID.
					//
					for (PDPGroup g : self.groups) {
						for (PDP p : g.getPdps()) {
							if (p.getId().equals(id)) {
								if (self.pdp != null) {
									//
									// we are editing this pdp
									//
									continue;
								}
								throw new InvalidValueException("URL must be unique - the PDP '" + id + "' already exists in group '" + g.getName() + "'");
							}
							if (id.equals(p.getName())) {
								throw new InvalidValueException("A previous PDP with URL '" + p.getId() + "' has been given the name '" + id + 
										"'.  Please edit that PDP to change the name before creating a nwe PDP with this URL.");
							}
							if (name != null && name.length() > 0 && self.pdp == null && (p.getId().equals(name) || name.equals(p.getName()))) {
								throw new InvalidValueException("Name must not be the same as another PDP's name OR another PDP's URL.");
							}
						}
					}
					//
					// make sure name is NOT a URL, unless it is identical to the ID.
					// (If it is a URL, then a later PDP might be created with that URL as it's ID, which would be confusing.)
					//
					if ( ! id.equals(name)) {
						try {
							new URL(name);
							// if we get here the name is a URL but not identical to the id, which is not good
							AdminNotification.warn("The Name must not be a URL unless it is the same as the PDP URL");
							return;
						} catch (Exception e) { //NOPMD
							// ignore - we want to get here
						}
					}
					//
					// If we get here the inputs are ok
					//
					self.isSaved = true;
					//
					//
					//
					self.close();
				} catch (SourceException | InvalidValueException e1) { //NOPMD
					//
					// Vaadin will display error
					//
				}
			}
		});
	}
	
	public boolean isSaved() {
		return this.isSaved;
	}
	
	public String getPDPId() {
		return this.textId.getValue();
	}
	
	public String getPDPName() {
		return this.textName.getValue();
	}
	
	public String getPDPDescription() {
		return this.textDescription.getValue();
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("-1px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("-1px");
		setHeight("-1px");
		
		// textId
		textId = new TextField();
		textId.setCaption("PDP URL");
		textId.setImmediate(false);
		textId.setDescription("The URL is the ID of the PDP");
		textId.setWidth("-1px");
		textId.setHeight("-1px");
		textId.setRequired(true);
		textId.setInputPrompt("Eg. http://localhost:8080/pdp");
		mainLayout.addComponent(textId);
		
		// textName
		textName = new TextField();
		textName.setCaption("PDP Name");
		textName.setImmediate(false);
		textName.setWidth("-1px");
		textName.setHeight("-1px");
		mainLayout.addComponent(textName);
		
		// textDescription
		textDescription = new TextArea();
		textDescription.setCaption("PDP Description");
		textDescription.setImmediate(false);
		textDescription.setWidth("100.0%");
		textDescription.setHeight("-1px");
		textDescription.setNullSettingAllowed(true);
		mainLayout.addComponent(textDescription);
		mainLayout.setExpandRatio(textDescription, 1.0f);
		
		// buttonSave
		buttonSave = new Button();
		buttonSave.setCaption("Save");
		buttonSave.setImmediate(true);
		buttonSave.setWidth("-1px");
		buttonSave.setHeight("-1px");
		mainLayout.addComponent(buttonSave);
		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
		
		return mainLayout;
	}

}
