package com.tandbergtv.metadatamanager.factoryImpl;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.w3c.dom.Document;

import com.tandbergtv.metadatamanager.model.Spec;
import com.tandbergtv.metadatamanager.spec.ISpecHandler;

/**
 * Factory class which contains all spec handlers.
 * 
 * @author spuranik
 * 
 */
public class SpecHandlerFactory {

	/* spec-> spec handler instance */
	private static Map<String, ISpecHandler> handlers;

	public SpecHandlerFactory(Map<String, ISpecHandler> handlers) {
		SpecHandlerFactory.handlers = handlers;
	}

	public SpecHandlerFactory() {
		handlers = new HashMap<String, ISpecHandler>();
	}
	
	/**
	 * returns an instance of the specHandler for a given Spec
	 * @param specification
	 * @return
	 */
	public static ISpecHandler getInstance(String specification) {
		return handlers.get(specification);
	}

	@Deprecated
	public static ISpecHandler getInstance(Spec specification) {
		return handlers.get(specification.toString());
	}

	/**
	 * @return the handlers
	 */
	public static Map<String, ISpecHandler> getHandlers() {
		return handlers;
	}

	
	public static void setHandlers(Map<String, ISpecHandler> handlers) {
		SpecHandlerFactory.handlers = handlers;
	}

	/**
	 * for a given metadata doc, determines the spec and returns the appropriate
	 * handler
	 * 
	 * @param metadataDoc
	 * @return handler
	 */
	public static ISpecHandler getInstance(Document metadataDoc) {

		Iterator<Entry<String, ISpecHandler>> it = handlers.entrySet().iterator();

		while (it.hasNext()) {
			ISpecHandler handler = it.next().getValue();
			Spec spec = handler.getSpecName(metadataDoc);
			if (spec != null) {
				return handler;
			}
		}
		return null;
	}
}
