/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.runtime.web.vaadin.components.dialogs;

import java.util.Locale;

import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;

import com.vaadin.ui.UI;
import com.vaadin.ui.Window;

/**
 * Dialog to accept the reload of dirty data. Data will be lost if proceeded.
 */
public class AcceptReloadDialog extends OptionsDialog {

	public static void showDialog(IDSLMetadataService service, IThemeResourceService themeResource, Runnable onDelete,
			Runnable onCancel) {
		if (service == null) {
			throw new NullPointerException("Please pass an i18nService");
		}

		Locale locale = UI.getCurrent().getLocale();
		String dialogTitle = service.translate(locale.toLanguageTag(), IDialogI18nKeys.ACCEPT_RELOAD_DIALOG_TITLE);
		String dialogMessage = service.translate(locale.toLanguageTag(), IDialogI18nKeys.ACCEPT_RELOAD_DIALOG_MESSAGE);
		String dialogDescription = service.translate(locale.toLanguageTag(),
				IDialogI18nKeys.ACCEPT_RELOAD_DIALOG_DESCRIPTION);
		String dialogIcon = IDialogI18nKeys.ACCEPT_RELOAD_DIALOG_ICON;
		String optionDeleteCaption = service.translate(locale.toLanguageTag(),
				IDialogI18nKeys.ACCEPT_RELOAD__DIALOG_OPTION__RELOAD_CAPTION);
		String optionDeleteDescription = service.translate(locale.toLanguageTag(),
				IDialogI18nKeys.ACCEPT_RELOAD__DIALOG_OPTION__RELOAD_DESCRIPTION);
		String optionDeleteIcon = IDialogI18nKeys.ACCEPT_RELOAD__DIALOG_OPTION__RELOAD_ICON;
		String optionCancelCaption = service.translate(locale.toLanguageTag(),
				IDialogI18nKeys.DIALOG_OPTION__CANCEL_CAPTION);
		String optionCancelDescription = service.translate(locale.toLanguageTag(),
				IDialogI18nKeys.DIALOG_OPTION__CANCEL_DESCRIPTION);
		String optionCancelIcon = IDialogI18nKeys.DIALOG_OPTION__CANCEL_ICON;

		DialogConfig config = new DialogConfig(dialogTitle, dialogMessage, dialogDescription,
				themeResource.getThemeResource(dialogIcon, ThemeResourceType.ICON)) {
			@Override
			public void config(Window window) {
				super.config(window);
				window.setHeight("170px");
				window.setWidth("350px");
				window.center();
			}
		};

		AcceptReloadDialog dialog = new AcceptReloadDialog(config,
				new Option(optionCancelCaption, optionCancelDescription,
						themeResource.getThemeResource(optionCancelIcon, ThemeResourceType.ICON), onCancel),
				new Option(optionDeleteCaption, optionDeleteDescription,
						themeResource.getThemeResource(optionDeleteIcon, ThemeResourceType.ICON), onDelete));
		dialog.open();
	}

	private AcceptReloadDialog(DialogConfig config, Option... options) {
		super(config, options);
	}

}
