package eu.dnetlib.server;

import java.util.ArrayList;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import eu.dnetlib.client.LoadService;
import eu.dnetlib.client.shared.StartUpComponents;
import eu.dnetlib.efg1914.authoring.components.Configuration;
import eu.dnetlib.efg1914.authoring.managers.ComponentManager;
import eu.dnetlib.efg1914.authoring.managers.ComponentManagerException;
import eu.dnetlib.efg1914.authoring.managers.UserManager;
import eu.dnetlib.efg1914.authoring.managers.UserManagerException;
import eu.dnetlib.efg1914.authoring.users.User;
import eu.dnetlib.efg1914.commons.store.XMLStoreException;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
@Service("loadService")
public class LoadServiceImpl extends RemoteServiceServlet implements LoadService {
	// TODO move curators to component manager
	// @Autowired
	// private CacheLoader cacheLoader;
	private WebApplicationContext context = null;

	private static Logger log = Logger.getLogger("LoadServiceImpl");
	private ComponentManager componentManager = null;

	private UserManager userManager = null;

	private String serverpath = null;
	private String previewPage = null;

	private Integer reloadTime = null;

	public LoadServiceImpl() {

	}

	public StartUpComponents load(User user) throws XMLStoreException {
		try {
			context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

			userManager = (UserManager) context.getBean("userManager");
			componentManager = (ComponentManager) context.getBean("componentManager");
			serverpath = (String) context.getBean("serverpath");
			reloadTime = (Integer) context.getBean("reloadTime");
			previewPage = (String) context.getBean("previewPage");
			log.warning("------------------****#################Update theme!!!!!!!!!");
			HttpServletRequest request = this.getThreadLocalRequest();
			if (request != null) {
				// dont create a new one -> false
				HttpSession session = request.getSession(false);
				if (session != null) {
					Object userObj = session.getAttribute("UserID");
					if (userObj != null && userObj instanceof User) {
						log.warning("------------------****#################3 valid:true");
					}else{
						log.warning("------------------****#################3 user:::false");
					}
				}else{
					log.warning("------------------****#################3 session:::NULL");
				}
			}else{
				log.warning("------------------****#################3 request:::NULL");
			}
			log.warning("------------------****#################3 valid:---");
			if (componentManager == null) {
				log.warning("componentManager bean failed to load on LoadingService");

			}

			StartUpComponents startupComponents = new StartUpComponents();

			log.info("returning...");

			// ####################### ITEMS
			// ######################
			startupComponents.setAllItems(this.componentManager.getAllItemsMap());

			// ####################### Frames
			// ######################
			startupComponents.setAllFrames(this.componentManager.getAllFramesMap());
			// log.info(" load  all frames" +
			// startupComponents.getAllFrames().size());

			// ####################### Topics
			// ######################
			startupComponents.setAllTopics(this.componentManager.getAllTopicsMap());

			// ####################### Themes
			// ######################
			startupComponents.setAllThemes(this.componentManager.getAllThemesMap());

			// ####################### Archives
			// ######################
			startupComponents.setArchives(componentManager.getArchivesMap());
			// ####################### Curators
			// ######################
			startupComponents.setCurators(userManager.getCurators());
			startupComponents.setPermissions(userManager.loadPermissions(user.getUsername()));
			startupComponents.setUser(user);
			startupComponents.setServerPath(serverpath);
			startupComponents.setReloadTime(reloadTime);
			startupComponents.setPreviewPage(previewPage);

			startupComponents.setConfiguration(loadConfiguration());
			startupComponents.setMyLockedComponentList(new ArrayList<String>());
			startupComponents.setAliasIds(componentManager.getAllAlias());
			return startupComponents;
		} catch (ComponentManagerException e) {
			e.printStackTrace();
			log.warning(e.toString());
			throw new XMLStoreException(e.toString(), e);
		} catch (UserManagerException e) {
			e.printStackTrace();
			log.warning(e.toString());
			throw new XMLStoreException(e);

		}

	}

	public StartUpComponents loadAfter(User user, String updateTime) throws XMLStoreException {
		try {
			context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

			userManager = (UserManager) context.getBean("userManager");
			componentManager = (ComponentManager) context.getBean("componentManager");
			serverpath = (String) context.getBean("serverpath");
			previewPage = (String) context.getBean("previewPage");
			if (componentManager == null) {
				log.warning("componentManager bean failed to load on LoadingService");

			}

			StartUpComponents startupComponents = new StartUpComponents();

			log.info("returning...");

			// ####################### ITEMS
			// ######################
			startupComponents.setAllItems(this.componentManager.getUpdatedItems(updateTime));

			// ####################### Frames
			// ######################
			startupComponents.setAllFrames(this.componentManager.getUpdatedFrames(updateTime));
			// log.info(" load  all frames" +
			// startupComponents.getAllFrames().size());

			// ####################### Topics
			// ######################
			startupComponents.setAllTopics(this.componentManager.getUpdatedTopics(updateTime));

			// ####################### Themes
			// ######################
			startupComponents.setAllThemes(this.componentManager.getUpdatedThemes(updateTime));

			startupComponents.setReloadTime(reloadTime);

			// ####################### Archives
			// ######################
			startupComponents.setArchives(componentManager.getArchivesMap());
			// ####################### Curators
			// ######################
			startupComponents.setCurators(userManager.getUpdatedCurators(updateTime));
			startupComponents.setPermissions(userManager.loadPermissions(user.getUsername()));
			startupComponents.setUser(user);
			startupComponents.setServerPath(serverpath);
			startupComponents.setPreviewPage(previewPage);
			startupComponents.setConfiguration(componentManager.getUpdatedConfigurationByName("EFG1914", updateTime));
			startupComponents.setDeletedComponents(componentManager.getDeletedComponentsAfterTime(updateTime));
			startupComponents.setAliasIds(componentManager.getAllAlias());
			return startupComponents;
		} catch (ComponentManagerException e) {
			log.warning("ComponentManagerException"+e.toString());
			e.printStackTrace();
			throw new XMLStoreException(e.toString(), e);
		} catch (UserManagerException e) {
			e.printStackTrace();
			log.warning("UserManagerException"+e.toString());
			throw new XMLStoreException(e);

		}

	}

	public Configuration loadConfiguration() throws ComponentManagerException {
		return componentManager.getConfigurationByName("EFG1914");

	}
}
