/*******************************************************************************
 * Copyright 2012 University of Southern California
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * 	http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * This code was developed by the Information Integration Group as part 
 * of the Karma project at the Information Sciences Institute of the 
 * University of Southern California.  For more information, publications, 
 * and related projects, please see: http://www.isi.edu/integration
 ******************************************************************************/
package edu.isi.karma.rep;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import edu.isi.karma.controller.command.CommandPreferences;
import edu.isi.karma.controller.history.CommandHistory;
import edu.isi.karma.modeling.alignment.AlignmentManager;
import edu.isi.karma.modeling.ontology.OntologyManager;
import edu.isi.karma.modeling.semantictypes.ISemanticTypeModelHandler;
import edu.isi.karma.rep.metadata.TagsContainer;
import edu.isi.karma.semantictypes.typinghandler.HybridSTModelHandler;
import edu.isi.karma.semantictypes.typinghandler.LuceneBasedSTModelHandler;

/**
 * Contains all the data to support a single instance of Karma, called a
 * workspace.
 * 
 * @author szekely
 * 
 */
public class Workspace extends Entity {

	private static final Logger logger = LoggerFactory.getLogger(Workspace.class);
	/**
	 * Factory to create all the objects in this workspace
	 */
	private final RepFactory factory = new RepFactory();

	/**
	 * History of commands performed in this workspace.
	 */
	private CommandHistory commandHistory = new CommandHistory();

	/**
	 * Record all the worksheets defined in this workspace.
	 */
	private final Map<String, Worksheet> worksheets = new ConcurrentHashMap<>();
	
	/**
	 * Saves all the tagging information
	 */
	private final TagsContainer tagsContainer = new TagsContainer();

	/**
	 * Manages the model constructed from the imported ontologies
	 */
	private  OntologyManager ontologyManager;
	
	/**
	 * The CRF Model for the workspace
	 */
	private final ISemanticTypeModelHandler semTypeModelHandler;
	
	private final CommandPreferences commandPreferences;

	private final String commandPreferencesId;
	
	private final String contextId;

	/**
	 * In the future we may need to keep track of user info.
	 */
	protected Workspace(String id, String contextId) {
		super(id);
		logger.info("LuceneWorkspace");
		commandPreferences = new CommandPreferences(this.getId(), contextId);
		commandPreferencesId=this.getId();
		this.contextId = contextId;
		this.semTypeModelHandler = new LuceneBasedSTModelHandler(contextId);
	}
	
	protected Workspace(String id, String cachedPreferencesId, String contextId) {
		super(id);
		logger.info("HybridWorkspace");
		this.commandPreferences = new CommandPreferences(cachedPreferencesId, contextId);
		this.commandPreferencesId = cachedPreferencesId;
		this.contextId = contextId;
		this.semTypeModelHandler = new HybridSTModelHandler(contextId);
	}

	public CommandHistory getCommandHistory() {
		if(commandHistory == null)
		{
			commandHistory = new CommandHistory();
		}
		return commandHistory;
	}

	void addWorksheet(Worksheet worksheet) {
		worksheets.put(worksheet.getId(), worksheet);
	}

	public void removeWorksheet(String id) {
		factory.removeWorksheet(id, commandHistory);
		String alignmentId = AlignmentManager.Instance().constructAlignmentId(
				getId(), id);
		AlignmentManager.Instance().removeAlignment(alignmentId);
		this.commandHistory.removeWorksheetHistory(id);
		this.worksheets.remove(id);
	}
	
	public Worksheet getWorksheet(String id) {
		return worksheets.get(id);
	}

	public Collection<Worksheet> getWorksheets() {
		return new ArrayList<>(worksheets.values());
	}

	public RepFactory getFactory() {
		return factory;
	}

	public TagsContainer getTagsContainer() {
		return tagsContainer;
	}

	public OntologyManager getOntologyManager() {
		if(ontologyManager == null)
		{
			ontologyManager = new OntologyManager(contextId);
		}
		return ontologyManager;
	}

	public ISemanticTypeModelHandler getSemanticTypeModelHandler() {
		return semTypeModelHandler;
	}

	public CommandPreferences getCommandPreferences() {
		return commandPreferences;
	}

	public String getCommandPreferencesId() {
		return commandPreferencesId;
	}
	public String getContextId()
	{
		return contextId;
	}
}
