package eu.dnetlib.client.updaters;

import java.util.logging.Logger;

import javax.inject.Inject;

import com.google.inject.Singleton;
import com.sencha.gxt.widget.core.client.info.Info;

import eu.dnetlib.client.managers.PermissionsManager;
import eu.dnetlib.client.resources.frame.Frames;
import eu.dnetlib.client.resources.item.Items;
import eu.dnetlib.client.resources.systemconfigration.SystemConfiguration;
import eu.dnetlib.client.resources.theme.Themes;
import eu.dnetlib.client.resources.topic.Topics;
import eu.dnetlib.client.resources.usermanagement.Users;
import eu.dnetlib.client.shared.StartUpComponents;
import eu.dnetlib.efg1914.authoring.components.Configuration;
import eu.dnetlib.efg1914.authoring.components.Frame;
import eu.dnetlib.efg1914.authoring.components.Item;
import eu.dnetlib.efg1914.authoring.components.Theme;
import eu.dnetlib.efg1914.authoring.components.Topic;
import eu.dnetlib.efg1914.authoring.users.User;

/*
 * 
 */
@Singleton
public class LayoutUpdaterImpl implements LayoutUpdater {
	@Inject
	private Items Items;
	@Inject
	private Frames Frames;
	@Inject
	private Topics Topics;
	@Inject
	private Themes Themes;
	@Inject
	private Users users;
	@Inject
	private SystemConfiguration systemConfiguration;
	@Inject
	private StartUpComponents startUpComponents;

	private static Logger log = Logger.getLogger("LayoutUpdaterImpl.java");
	@Inject
	private PermissionsManager permissionsManager;

	@Inject
	public LayoutUpdaterImpl() {

	}

	public void addNewItem(String userId, Item item, boolean isLocal) {
		boolean edit = permissionsManager.isPermitted(userId, item.getId(), "item", item.getCurator(), "edit");
		Items.createNewItem(item, isLocal, edit, !startUpComponents.getUser().getId().equals(item.getCurator()));

		if (isLocal) {
			if (Frames.getCreateItem().isEnabled()) {
				Items.getItemEditPanel().newItemAction(item);
			} else {
				Frames.getItemEditPanel().newItemAction(item);
			}
			Items.getPopupMessage().hide();
		}
		Info.display("New Item", "Item '" + item.getTitle() + "' created.");

	}

	public void updateItem(String userId, Item item, boolean isLocal, boolean inUse) {

		if (item.getCurator().equals(userId)) {
			this.Items.updateThumb(item.getId(), item, false, inUse, isLocal);
		} else {

			this.Items.updateThumb(item.getId(), item, true, inUse, isLocal);

		}

		if (isLocal && !inUse) {
			this.Items.getItemEditPanel().setChanged(false);
			Items.getItemEditPanel().updatedItemAction(item);
			Items.getPopupMessage().hide();

		}
	}

	public void removeDeletedItem(String userId, Item item, boolean isLocal) {

		this.Items.deleteThumb(item.getId(), !startUpComponents.getUser().getId().equals(item.getCurator()));

		// log.info(" item   REMOVED from layout sucessfully");
		if (!isLocal) {
			Info.display("Deleted Item", "Item '" + item.getTitle() + "' deleted.");
		} else {
			Items.getPopupMessage().hide();

		}
	}

	public void addNewFrame(String userId, Frame frame, boolean isLocal) {

		boolean edit = permissionsManager.isPermitted(userId, frame.getId(), "frame", frame.getCurator(), "edit");
		// ask for user rights
		Frames.updateThumbPanelWithNewFrame(frame, !startUpComponents.getUser().getId().equals(frame.getCurator()), edit, isLocal);

		if (isLocal) {
			Frames.clearCreatePanels();
			Frames.getPopupMessage().hide();

		}
		Info.display("New Frame", "Frame '" + frame.getTitle() + "' created.");

	}

	public void removeDeletedFrame(String userId, Frame frame, boolean isLocal) {
		this.Frames.deleteThumb(frame.getId(), !startUpComponents.getUser().getId().equals(frame.getCurator()), -1);
		if (!isLocal) {

			Info.display("Delete Frame", "Frame '" + frame.getTitle() + "' deleted.");
		} else {
			Frames.getPopupMessage().hide();
		}
	}

	public void updateFrame(String userId, Frame updatedFrame, boolean isLocal, boolean inUse) {

		this.Frames.UpdateThumbAfterFrameUpdate(updatedFrame, inUse, isLocal);

		if (isLocal && !inUse) {
			Frames.updateAction();
		} else {
			Frames.getPopupMessage().hide();
		}
	}

	public void addNewTopic(String userId, Topic topic, boolean isLocal) {
 		boolean edit = permissionsManager.isPermitted(userId, topic.getId(), "topic", topic.getCurator(), "edit");
		Topics.updateThumbPanelWithNewTopic(topic, !startUpComponents.getUser().getId().equals(topic.getCurator()), edit, isLocal);
	 
		if (isLocal) {
			Topics.clearCreatePanels();
			Topics.getPopupMessage().hide();
		}
		Info.display("New Topic", "Topic '" + topic.getTitle() + "' created.");

	}

	public void updateTopic(String userId, Topic updatedTopic, boolean isLocal, boolean inUse) {

		this.Topics.UpdateThumb(updatedTopic, inUse, isLocal);
//		if (systemConfiguration.getCreditsPage() != null) {
//			systemConfiguration.getCreditsPage().update(updatedTopic );
//		}
		if (isLocal && !inUse) {
			Topics.updateAction();
			Topics.getPopupMessage().hide();
            systemConfiguration.getCreditsPage().getPopupMessageforTopicCredits().hide();
		}
	}

	public void removeDeletedTopic(String userId, Topic topic, boolean isLocal) {

		try {
			this.Topics.deleteThumb(topic.getId(), !startUpComponents.getUser().getId().equals(topic.getCurator()), -1);
			if (systemConfiguration.getCreditsPage() != null) {
				systemConfiguration.getCreditsPage().update(topic );
			}
		} catch (Exception e) {
			log.warning("error deleting topic" + e);

		}
		if (!isLocal) {

			Info.display("Delete Topic", "Topic '" + topic.getTitle() + "' deleted.");
		} else {
			Topics.getPopupMessage().hide();
		}
	}

	public void addNewTheme(String userId, Theme theme, boolean isLocal) {

		boolean edit = permissionsManager.isPermitted(userId, theme.getId(), "theme", theme.getCurator(), "edit");
		Themes.updateThumbPanelWithNewTheme(theme, !startUpComponents.getUser().getId().equals(theme.getCurator()), edit, isLocal);
		if (systemConfiguration.getCreditsPage() != null) {
			systemConfiguration.getCreditsPage().update(theme );
		}
		if (isLocal) {
			Themes.createAction();
			Themes.getPopupMessage().hide();
		}
		Info.display("New Theme", "Theme '" + theme.getTitle() + "' created.");

	}

	public void updateTheme(String userId, Theme updatedTheme, boolean isLocal, boolean inUse) {
		log.info("OOOOOOOOOO update theme");
		this.Themes.UpdateThumb(updatedTheme, inUse, isLocal);
		if (systemConfiguration.getCreditsPage() != null) {
			systemConfiguration.getCreditsPage().update(updatedTheme );
		}
		if (isLocal && !inUse) {
			this.Themes.updateAction();
			Themes.getPopupMessage().hide();
		}
	}

	public void deleteTheme(String userId, Theme deletedTheme, boolean isLocal) {
		this.Themes.deleteThumb(deletedTheme.getId(), -1, !startUpComponents.getUser().getId().equals(deletedTheme.getCurator()));
 
		if (!isLocal) {

			Info.display("Delete Theme", "Theme '" + deletedTheme.getTitle() + "' deleted.");
		} else {
			Themes.getPopupMessage().hide();
		}
	}

	public PermissionsManager getPermissionsManager() {
		return permissionsManager;
	}

	public void setPermissionsManager(PermissionsManager permissionsManager) {
		this.permissionsManager = permissionsManager;
	}

	public void addNewUser(String userId, User user, boolean isLocal) {
		if ((!isLocal) && users.getPrimaryTab().getResourceThumbMap().containsKey(user.getId())) {
			return;
		}

		users.createNewUserResourceThumb(user);
		if (isLocal) {

			users.getAddUserPopupPanel().hide();
			users.enableButtons();
			users.getPopupMessage().hide();
			users.setToPreview(user.getUsername(), user.getId(), user, false);
		}
		Info.display("New user", "User '" + user.getUsername() + "' created.");
	}

	public void removeDeletedUser(String userId, String userToRemoveId, boolean isLocal) {
		String title = "";
		if (users.getPrimaryTab().getResourceThumbMap().get(userToRemoveId) != null && users.getPrimaryTab().getResourceThumbMap().get(userToRemoveId).getTitle().getText() != null) {
			title = users.getPrimaryTab().getResourceThumbMap().get(userToRemoveId).getTitle().getText();
		}

		users.deleteUserResourceThumb(userToRemoveId);
		if (isLocal) {
			users.getPopupMessage().hide();

		} else {
			Info.display("Delete user", "User '" + title + "' deleted.");

		}
	}

	public void updateUser(String userId, User user, boolean isLocal, boolean inUse) {
		users.updateUserResourceThumb(user, inUse, isLocal);
		if (!isLocal) {
			Info.display("User update", "User's '" + user.getUsername() + "' profile has been updated.");
		} else {
			users.enableButtons();
			users.getPopupMessage().hide();
			users.setToPreview(user.getUsername(), user.getId(), user, false);

		}

	}

	public void setLocked(String componentId, boolean isLocked, String UserId) {
		// if (!(isLocked &&
		// startUpComponents.getUser().getId().equals(UserId))) {
		// set lock unless if is about to lock and its locked from this user
		if (isLocked && (startUpComponents.getUser().getId().equals(UserId)) && startUpComponents.getMyLockedComponentList().contains(componentId)) {
			return;

		}

		Items.setLocked(componentId, isLocked);
		Frames.setLocked(componentId, isLocked);
		Topics.setLocked(componentId, isLocked);
		Themes.setLocked(componentId, isLocked);
		users.setLocked(componentId, isLocked);
		systemConfiguration.setLocked(componentId, isLocked);
		if (systemConfiguration.getCreditsPage() != null) {
			systemConfiguration.getCreditsPage().setLocked(componentId, isLocked);
		}

	}

	public void setPublished(String userId, String componentId, boolean isPublished) {
		Items.setPublished(componentId, isPublished);
		Frames.setPublished(componentId, isPublished);
		Topics.setPublished(componentId, isPublished);
		Themes.setPublished(componentId, isPublished);
		users.setPublished(componentId, isPublished);
	}

	public void updateConfiguration(String userId, Configuration configuration, boolean isLocal) {
		log.info("AAAAAAAAAAAAAAAAAAAAAA update configurarion LUI is local::"+isLocal);
		Items.getItemEditPanel().updatedConfiguration();
		Frames.getFramesForm().updatedConfiguration();
		Topics.getTopicsForm().updatedConfiguration();
		Themes.getThemesForm().updatedConfiguration();
		if (isLocal) {
			systemConfiguration.setButtonsEnable(true);
			systemConfiguration.getPopupMessage().hide();
		}

	}

	public void itemFails(boolean isLocal) {
		if (isLocal) {
			Items.getItemEditPanel().setEnableButtons(true);
			Frames.getItemEditPanel().setEnableButtons(true);
			Items.getPopupMessage().hide();

		}
	}

	public void frameFails(boolean isLocal) {
		if (isLocal) {
			Frames.getFramesForm().enableButtons(true);
			Frames.getCreateFramePanel().enableButtons(true);
			Frames.getPopupMessage().hide();

		}
	}

	public void topicFails(boolean isLocal) {
		if (isLocal) {

			Topics.getTopicsForm().enableButtons(true);
			Topics.getPopupMessage().hide();

		}
	}

	public void themeFails(boolean isLocal) {
		if (isLocal) {

			Themes.getThemesForm().enableButtons(true);
			Themes.getPopupMessage().hide();

		}
	}

	public void usersFails(boolean isLocal) {
		if (isLocal) {

			users.enableButtons();
			users.getPopupMessage().hide();

		}
	}

	public void configurationFails(boolean isLocal) {
		if (isLocal) {

			systemConfiguration.setButtonsEnable(true);
		}
	}
}
