package eu.dnetlib.client.resources;

import java.util.logging.Logger;

import javax.inject.Inject;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.Dialog.PredefinedButton;
import com.sencha.gxt.widget.core.client.box.MessageBox;
import com.sencha.gxt.widget.core.client.button.TextButton;

import eu.dnetlib.client.GinWidgetGinjector;
import eu.dnetlib.client.GreetingService;
import eu.dnetlib.client.GreetingServiceAsync;
import eu.dnetlib.client.managers.ActiveComponentsManager;
import eu.dnetlib.client.managers.PermissionsManager;
import eu.dnetlib.client.managers.UpdateManager;
import eu.dnetlib.client.resources.systemconfigration.SystemConfiguration;
import eu.dnetlib.client.shared.Filtering;
import eu.dnetlib.client.shared.MainMenuBar;
import eu.dnetlib.client.shared.MyTabPanel;
import eu.dnetlib.client.shared.PopupMessage;
import eu.dnetlib.client.shared.ResourceThumb;
import eu.dnetlib.client.shared.StartUpComponents;

public class ComponentsPage {
	protected PrimaryTab primaryTab;
	protected SecondaryTab secondaryTab;
	protected ComponentsPage nextPage;
	protected ComponentsPage previousPage;
	protected final FlowPanel panel = new FlowPanel();
	protected SystemConfiguration systemConfiguration;
	protected MessageBox cbPreview;
	protected MessageBox cbEdit;
	protected MessageBox cbCreate;
	protected MessageBox cbDelete;
	protected ResourceThumb previewThumb;
	protected ResourceThumb clickedThumb;
	protected VerticalPanel previewAndEdit = new VerticalPanel();
	@Inject
	protected StartUpComponents startUpComponents;
	protected MainMenuBar mainMenu;
	protected MyTabPanel tabPanel = new MyTabPanel();
	protected  Logger log = Logger.getLogger("ComponentsPage.java");
	protected UpdateManager updateManager;
	protected boolean history = false;
	protected ActiveComponentsManager activeComponentsManager;
	protected PermissionsManager permissionsManager;
	protected PopupMessage popupMessage = new PopupMessage();
	protected String idToDelete;
	protected boolean isSystemConfiguration = false;
	protected final GreetingServiceAsync service = GWT.create(GreetingService.class);
	private String type;
 
	public ComponentsPage(String title, String id) {
		log = Logger.getLogger("ComponentsPage ->"+title);
		type=title;
		panel.addStyleName(id);
		isSystemConfiguration = true;
	}

	public ComponentsPage(String title) {
		log = Logger.getLogger("ComponentsPage ->"+title);
		type=title;
		panel.addStyleName(title.toLowerCase());
		
		cbPreview = new MessageBox("Confirm", "Preview another " + title.toLowerCase().substring(0, title.length() - 1) + ". You may discard changes, do you want to proceed?");
		cbPreview.setPredefinedButtons(PredefinedButton.YES, PredefinedButton.CANCEL, PredefinedButton.NO);
		cbPreview.setIcon(MessageBox.ICONS.question());
		((TextButton) cbPreview.getButtonBar().getWidget(0)).setText("Discard");
		((TextButton) cbPreview.getButtonBar().getWidget(2)).setText("Save changes and proceed");
		cbPreview.setMinHeight(100);

		cbEdit = new MessageBox("Confirm", "Edit another " + title.toLowerCase().substring(0, title.length() - 1) + ". You may discard changes, do you want to proceed?");
		cbEdit.setPredefinedButtons(PredefinedButton.YES, PredefinedButton.CANCEL, PredefinedButton.NO);
		cbEdit.setIcon(MessageBox.ICONS.question());
		((TextButton) cbEdit.getButtonBar().getWidget(0)).setText("Discard");
		((TextButton) cbEdit.getButtonBar().getWidget(2)).setText("Save changes and proceed");
		cbEdit.setMinHeight(100);

		cbCreate = new MessageBox("Confirm", "You may discard changes. Do you want to proceed creating new " + title.toLowerCase().substring(0, title.length() - 1) + "?");
		cbCreate.setPredefinedButtons(PredefinedButton.YES, PredefinedButton.CANCEL, PredefinedButton.NO);
		cbCreate.setIcon(MessageBox.ICONS.question());
		((TextButton) cbCreate.getButtonBar().getWidget(0)).setText("Discard");
		((TextButton) cbCreate.getButtonBar().getWidget(2)).setText("Save changes and proceed");
		cbCreate.setMinHeight(100);

		cbDelete = new MessageBox("Confirm", "You're going to delete this " + title.toLowerCase().substring(0, title.length() - 1) + ". Do you want to proceed?<br>");
		cbDelete.setPredefinedButtons(PredefinedButton.YES, PredefinedButton.NO);
		cbDelete.setIcon(MessageBox.ICONS.warning());
		cbDelete.setMinHeight(100);
	}

	public void init() {
		activeComponentsManager = GinWidgetGinjector.INSTANCE.getActiveComponentsManager();
		updateManager = GinWidgetGinjector.INSTANCE.getUpdateManager();
		permissionsManager = GinWidgetGinjector.INSTANCE.getPermissionsManager();
		systemConfiguration = GinWidgetGinjector.INSTANCE.getSystemConfiguration();
		previewAndEdit.clear();
		panel.clear();
		panel.add(tabPanel);
		panel.add(previewAndEdit);
	}

	public void createTabs() {
		tabPanel.clear();
	 
		tabPanel.add(primaryTab.getPanel(), primaryTab.getTabText());
		if (secondaryTab != null) {
			tabPanel.setSecondTabWidget(secondaryTab.getPanel(), secondaryTab.getTabText());
			tabPanel.hideSecondTabBar();
			if (secondaryTab.getFilter() != null) {
 				secondaryTab.getFilter().setComponentsPage(this);
				secondaryTab.getFilter().fireEvent();
			}
		}
		tabPanel.selectTab(0);
		if (primaryTab.getFilter() != null) {
			primaryTab.getFilter().setComponentsPage(this);
			primaryTab.getFilter().fireEvent();
 		}
	}

	public MessageBox deleteCB(String idToDelete) {
		this.idToDelete = idToDelete;
		return cbDelete;
	}

	public boolean isLockedComponentAndMessage(String id) {
		if (activeComponentsManager.isLocked(id, startUpComponents.getUser().getId())) {
			final MessageBox box = warningLockedComponents();
			box.show();
			return true;
		}
		return false;
	}

	public boolean isPublishedComponentAndMessage(String id) {
		if (Filtering.filterPublished(id, startUpComponents)) {
			final MessageBox box = warningDeletePublished();
			box.show();
			return true;
		}
		return false;
	}

	public void deleteAction(String id) {
		if (isLockedComponentAndMessage(id)) {
			return;

		} else {
			if (!isPublishedComponentAndMessage(id)) {
				deleteCB(id).show();
			}
		}
	}

	public void setColor() {
		for (java.util.Map.Entry<String, ResourceThumb> entry : primaryTab.getResourceThumbMap().entrySet()) {
			entry.getValue().setBackroundNotClicked();
		}
	}

	// warning box for components in use
	public static MessageBox warningLockedComponents() {
		final MessageBox warning = new MessageBox(" Warning", "Current Componenent is in use by another user.");
		warning.setPredefinedButtons(PredefinedButton.OK);
		warning.setIcon(MessageBox.ICONS.warning());
		warning.setMinHeight(100);
		return warning;
	}
	// warning box for components in use
	public static MessageBox errorMessage(String message) {
		final MessageBox warning = new MessageBox(" Error", message);
		warning.setPredefinedButtons(PredefinedButton.OK);
		warning.setIcon(MessageBox.ICONS.error());
		warning.setMinHeight(100);
		return warning;
	}
	public static MessageBox warningDeletePublished() {
		final MessageBox warning = new MessageBox(" Warning", "This component is published.");

		warning.setPredefinedButtons(PredefinedButton.OK);
		warning.setIcon(MessageBox.ICONS.error());
		warning.setMinHeight(100);

		return warning;
	}

	public void updateEmptyMessages() {
		if (secondaryTab != null) {
			secondaryTab.getComponentsListBottom().getComponentsEmptyListmessage().setVisible((secondaryTab.getFilter().getAllCount() == 0) && !secondaryTab.getFilter().getMessageBottom().isVisible());
			secondaryTab.getComponentsListTop().getComponentsEmptyListmessage().setVisible((secondaryTab.getComponentsListTop().getResourceThumbsPanel().getWidgetCount() == 0) && !secondaryTab.getFilter().getMessageUp().isVisible());
		}

		primaryTab.getComponentsListTop().getComponentsEmptyListmessage().setVisible(primaryTab.getComponentsListTop().getResourceThumbsPanel().getWidgetCount() == 0 && (primaryTab.getFilter() == null || !primaryTab.getFilter().getMessageUp().isVisible()));
		if (primaryTab.getComponentsListBottom() != null) {
			primaryTab.getComponentsListBottom().getComponentsEmptyListmessage().setVisible((primaryTab.getComponentsListBottom().getResourceThumbsPanel().getWidgetCount() == 0) && (primaryTab.getFilter() == null || !primaryTab.getFilter().getMessageBottom().isVisible()));
		}
	}

	public void setPublished(String id, boolean published) {
		ResourceThumb resourceThumb = primaryTab.getResourceThumbMap().get(id);
		if (resourceThumb != null) {
			resourceThumb.setPublished(published);
		}

	}

	public void setLocked(String id, boolean locked) {
		ResourceThumb resourceThumb = primaryTab.getResourceThumbMap().get(id);
		if (resourceThumb != null) {
			resourceThumb.setLocked(locked);
		}
		
	}

	protected void createPreviewAndEditPanel(String title, Widget previewPanel, Widget editPanel) {
		previewAndEdit.setStyleName("previewAndEditPanel  ");
		previewAndEdit.add(new HTML(title));
		// preview
		previewAndEdit.add(previewPanel);
		// edit
		previewAndEdit.add(editPanel);
		editPanel.addStyleName("templateEditForm center");
		previewAndEdit.getWidget(0).setVisible(true);
		previewAndEdit.getWidget(1).setVisible(false);
		previewAndEdit.getWidget(2).setVisible(false);
	}

	public void showTitle() {
		previewAndEdit.getWidget(0).setVisible(true);
		previewAndEdit.getWidget(1).setVisible(false);
		previewAndEdit.getWidget(2).setVisible(false);
	}

	public void showEditArea() {
		previewAndEdit.getWidget(0).setVisible(false);
		previewAndEdit.getWidget(1).setVisible(false);
		previewAndEdit.getWidget(2).setVisible(true);
	}

	public void showPreview() {
		previewAndEdit.getWidget(0).setVisible(false);
		previewAndEdit.getWidget(1).setVisible(true);
		previewAndEdit.getWidget(2).setVisible(false);
	}

	public StartUpComponents getStartUpComponents() {
		return startUpComponents;
	}

	public FlowPanel getPanel() {
		return panel;
	}

	public MyTabPanel getTp() {
		return tabPanel;
	}

	public VerticalPanel getPreviewAndEdit() {
		return previewAndEdit;
	}

	public ResourceThumb getPreviewThumb() {
		return previewThumb;
	}

	public void setPreviewTopicThumb(ResourceThumb previewTopicThumb) {
		this.previewThumb = previewTopicThumb;
	}

	public PopupMessage getPopupMessage() {
		return popupMessage;
	}

	public void setMainMenu(MainMenuBar mainMenu) {
		this.mainMenu = mainMenu;
	}

	public ComponentsPage getNextPage() {
		return nextPage;
	}

	public void setNextPage(ComponentsPage nextPage) {
		this.nextPage = nextPage;
	}

	public ComponentsPage getPreviousPage() {
		return previousPage;
	}

	public void setPreviousPage(ComponentsPage previousPage) {
		this.previousPage = previousPage;
	}

	public MessageBox getCbCreate() {
		return cbCreate;
	}

	public PrimaryTab getPrimaryTab() {
		return primaryTab;
	}

	public SecondaryTab getSecondaryTab() {
		return secondaryTab;
	}
}
