/**
 * TitleProviderRegistry.java
 * Created May 15, 2008
 * Copyright (c) TANDBERG Television 2007-2008
 */
package com.tandbergtv.watchpoint.pmm.title.provider.internal;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import com.tandbergtv.watchpoint.pmm.title.provider.ITitleProvider;
import com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry;


/**
 * The registry of ITitleProvider implementations
 * 
 * @author Sahil Verma
 */
public class TitleProviderRegistry implements ITitleProviderRegistry {

	private Map<String, ITitleProvider> registry;
	
	private static final String SYSTEM_ID = "01";
	
	/**
	 * Creates a TitleProviderRegistry
	 */
	public TitleProviderRegistry() {
		registry = new HashMap<String, ITitleProvider>();
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#addProvider(com.tandbergtv.watchpoint.pmm.title.provider.ITitleProvider)
	 */
	public void addProvider(ITitleProvider provider) {
		registry.put(provider.getSystemID(), provider);
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#getDefaultProvider()
	 */
	public ITitleProvider getDefaultProvider() {
		return registry.get(SYSTEM_ID);
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#getProvider(java.lang.String)
	 */
	public ITitleProvider getProvider(String id) {
		return registry.get(id);
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#getProviderForTitle(java.lang.String)
	 */
	public ITitleProvider getProviderForTitle(String titleExternalLocation) {
		String systemId = "";
		if (titleExternalLocation != null) {
			int index = titleExternalLocation.indexOf("-");
			if (index != -1) {
				systemId = titleExternalLocation.substring(0, index);
			}
		}
		
		return this.getProvider(systemId);
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#getProviders()
	 */
	public Collection<ITitleProvider> getProviders() {
		return registry.values();
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#getProviders(java.lang.String)
	 */
	public Collection<ITitleProvider> getProviders(String specification) {
		Collection<ITitleProvider> providers = new HashSet<ITitleProvider>();
		
		for (ITitleProvider provider : registry.values()) {
			if (provider.supportsSpecification(specification))
				providers.add(provider);
		}
		
		return providers;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.watchpoint.pmm.title.provider.ITitleProviderRegistry#removeProvider(com.tandbergtv.watchpoint.pmm.title.provider.ITitleProvider)
	 */
	public void removeProvider(ITitleProvider provider) {
		registry.remove(provider.getSystemID());
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.service.Service#getServiceName()
	 */
	public String getServiceName() {
		return "Title Provider Registry";
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.service.ServiceLifecycle#start()
	 */
	public void start() {
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.core.service.ServiceLifecycle#stop()
	 */
	public void stop() {
		/* There are no lifecycle methods on the provider - do we need them? */
		registry.clear();
	}
}
