package eu.dnetlib.server.loader;

import java.util.ArrayList;
import java.util.List;

import eu.dnetlib.client.loader.ReloadListener;
import eu.dnetlib.client.shared.StartUpComponents;
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;

public class CacheLoader implements Runnable {

	private transient org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(CacheLoader.class);

	private ComponentManager componentManager;
	private UserManager userManager;
	private StartUpComponents startupComponents = new StartUpComponents();
	private List<ReloadListener> listeners = new ArrayList<ReloadListener>();

 	public void run() {
		try {
			log.info("running....");
			load();

		} catch (LoadException e) {

			log.error(e);

		}

	}

	// loads latest components from database

	private void load() throws LoadException {

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

			log.info("load  all items" + startupComponents.getAllItems().size());

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

			// ####################### Topics ######################
			startupComponents.setAllTopics(this.componentManager.getAllTopicsMap());
			log.info(" load all topics" + startupComponents.getAllTopics().size());

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

			log.info(" load all themes" + startupComponents.getAllThemes().size());

			// ####################### Archives ######################
			startupComponents.setArchives(componentManager.getArchivesMap());
			log.info("archives" + startupComponents.getArchives());
			// ####################### Curators ######################
			startupComponents.setCurators(userManager.getCurators());
			log.info("curators" + startupComponents.getCurators());

			// TODO let clients know that they should reload components
			signifyListeners();

		} catch (ComponentManagerException e) {
			log.warn(e);
			throw new LoadException(e.toString(), e);
		} catch (UserManagerException e) {
			log.warn(e);
			throw new LoadException(e.toString(), e);

		}
	}

	public void addListener(ReloadListener toAdd) {
		listeners.add(toAdd);
	}

	public void signifyListeners() {
		log.info("Hello from loader!!!!!");

		// Notify everybody that may be interested.
		for (ReloadListener hl : listeners)
			hl.reload();
	}

	public ComponentManager getComponentManager() {
		return componentManager;
	}

	public void setComponentManager(ComponentManager componentManager) {
		this.componentManager = componentManager;
	}

	public UserManager getUserManager() {
		return userManager;
	}

	public void setUserManager(UserManager userManager) {
		this.userManager = userManager;
	}

	public StartUpComponents getStartupComponents() {
		return startupComponents;
	}

	public void setStartupComponents(StartUpComponents startupComponents) {
		this.startupComponents = startupComponents;
	}

}
