/*
 *                                                                            
 *  Copyright (c) 2011 - 2017 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Initial contribution:                                                      
 *     Loetz GmbH & Co. KG                              
 * 
 */
package org.eclipse.osbp.vaaclipse.addons.softwarefactory.administration;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;

import javax.inject.Inject;

import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.dsl.metadata.service.DSLBuilderParticipant.DSLMetadataService;
import org.eclipse.osbp.ecview.extension.strategy.util.PdfPrintService;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.preferences.ProductConfigurationPrefs;
import org.eclipse.osbp.runtime.common.i18n.II18nService;
import org.eclipse.osbp.ui.api.contextfunction.IVaadinDialogProvider;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.utils.vaadin.MDXDialog;
import org.eclipse.osbp.vaaclipse.addons.keybinding.IKeyBindingService;
import org.eclipse.osbp.vaadin.emf.api.IModelingContext;
import org.eclipse.osbp.vaadin.emf.data.fields.EObjectComboBox;
import org.eclipse.osbp.xtext.reportdsl.Report;
import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage;
import org.osgi.service.prefs.BackingStoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

/**
 * The Class KeyBindingDialogProvider.
 */
public class ReportPrinterDialogProvider implements IVaadinDialogProvider, IUser.UserLocaleListener {

	/** The metadata service. */
	@Inject
	private IDSLMetadataService dslMetadataService;

	/** The modeling context. */
	@Inject
	IModelingContext modelingContext;

	/** The report combo box. */
	private ComboBox reportCombo;

	/** The printer combo box. */
	private ComboBox printerCombo;

	/** The save button */
	private Button saveButton;
	
	/** The table. */
	private Table table;

	String reportColumn = "report";
	String printerColumn = "printer";

	private Button deleteButton;

	private static final Logger LOGGER = LoggerFactory.getLogger(ReportPrinterDialogProvider.class);
	
	@Override
	public void localeChanged(Locale locale) {
		reportCombo.setCaption(dslMetadataService.translate(locale.toLanguageTag(), "reportLabelText"));
		printerCombo.setCaption(dslMetadataService.translate(locale.toLanguageTag(), "printerLabelText"));
		table.setColumnHeader("report", dslMetadataService.translate(locale.toLanguageTag(), "report"));
		table.setColumnHeader("printer", dslMetadataService.translate(locale.toLanguageTag(), "printer"));
	}

	@Override
	public Component getDialog() {
		VerticalLayout content = new VerticalLayout();
		createView(content);
		return content;
	}

	@Override
	public void createView(VerticalLayout parent) {
		parent.setMargin(true);
		VerticalLayout innerLayout = new VerticalLayout();
		parent.addComponent(innerLayout);
		
		// Table - Report to printer binding
		table = new Table();
		table.setSelectable(true);
		table.setSizeFull();
		table.addContainerProperty(reportColumn, String.class, null);
		table.addContainerProperty(printerColumn, String.class, null);
		table.addItemClickListener(e -> {
			fillCombos(e);
		});
		fillTableItems();
		innerLayout.addComponent(table);

		// ComboBox providing the names of all existing reports
		reportCombo = new ComboBox();
		reportCombo.setCaption("Reports");
		reportCombo.setImmediate(true);
		reportCombo.setSizeFull();
		List<String> result = new ArrayList<>();
		for (EObject eObj : dslMetadataService.getAll(ReportDSLPackage.Literals.REPORT)) {
			result.add(((Report)eObj).getName());
		}
		reportCombo.addItems(result);
		reportCombo.addValueChangeListener(e -> {
			enableSaveButton();
		});
		innerLayout.addComponent(reportCombo);
		
		// ComboBox of all existing printer
		printerCombo = new ComboBox();
		printerCombo.setCaption("Printer");
		printerCombo.setImmediate(true);
		printerCombo.setSizeFull();
		printerCombo.addItems(PdfPrintService.reLookupPrintServiceNames());
		printerCombo.addValueChangeListener(e -> {
			enableSaveButton();
		});
		innerLayout.addComponent(printerCombo);
		
		HorizontalLayout horizontalLayout = new HorizontalLayout();
		//Save button
		saveButton = new Button("Save");
		saveButton.setEnabled(false);
		saveButton.addClickListener(e -> {
			saveOnProperties();
			table.removeAllItems();
			fillTableItems();
		});
		horizontalLayout.addComponent(saveButton);
		//Delete button
		deleteButton = new Button("Delete");
		deleteButton.setEnabled(false);
		deleteButton.addClickListener(e -> {
			deleteOnProperties();
			table.removeAllItems();
			fillTableItems();
		});
		horizontalLayout.addComponent(deleteButton);
		innerLayout.addComponent(horizontalLayout);
		
	}

	private void fillCombos(ItemClickEvent e) {
		Item item = e.getItem();
		reportCombo.setValue(item.getItemProperty(reportColumn).getValue());
		printerCombo.setValue(item.getItemProperty(printerColumn).getValue());
	}

	@SuppressWarnings("unchecked")
	private void fillTableItems() {
		try {
			for (String reportName : ProductConfiguration.prefs().getReportPrinterPrefs().keys()) {
				Object newItem = table.addItem();
				Item item = table.getItem(newItem);
				item.getItemProperty(reportColumn).setValue(reportName);
				item.getItemProperty(printerColumn).setValue(ProductConfiguration.prefs().getReportPrinter(reportName));
			}
		} catch (UnsupportedOperationException e1) {
			LOGGER.error(e1.getMessage(), e1);
		} catch (BackingStoreException e1) {
			LOGGER.error(e1.getMessage(), e1);
		} 
	}

	private void saveOnProperties() {
		String reportName = (String) reportCombo.getValue();
		String printerName = (String) printerCombo.getValue();
		ProductConfiguration.prefs().setReportPrinter(reportName, printerName);
	}
	
	private void deleteOnProperties() {
		String reportName = (String) reportCombo.getValue();
		ProductConfiguration.prefs().removeReportPrinter(reportName);
	}
	
	private void enableSaveButton(){
		if ((reportCombo.getValue()!=null) && (printerCombo.getValue()!=null)){
			saveButton.setEnabled(true);
			deleteButton.setEnabled(true);
		}
	}
	
}
