/**
 * 
 */
package com.tandbergtv.metadatamanager;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import junit.framework.TestCase;

import org.java.plugin.registry.Extension;
import org.java.plugin.registry.ExtensionPoint;
import org.java.plugin.registry.PluginRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import com.tandbergtv.metadatamanager.conf.SpecificationBuilder;
import com.tandbergtv.metadatamanager.exception.MetadataException;
import com.tandbergtv.metadatamanager.exception.SearchException;
import com.tandbergtv.metadatamanager.exception.TranslationException;
import com.tandbergtv.metadatamanager.factoryImpl.SpecHandlerFactory;
import com.tandbergtv.metadatamanager.search.AssetSearchService;
import com.tandbergtv.metadatamanager.spec.IIdentifier;
import com.tandbergtv.metadatamanager.spec.ISpecHandler;
import com.tandbergtv.metadatamanager.specimpl.cl1_1.CL1_1_Identifier;

/**
 * @author vaibhav
 *
 */
public class JPFActivatorTest extends TestCase {
	
	private ApplicationContext context;
	private static final String JPF_PLUGIN_REPOSITORY_PROPERTY = "org.java.plugin.boot.pluginsRepositories";
	private static final String PLUGIN_ID = "com.tandbergtv.metadata";

	/* The Extension Point ID */
	private static final String EXTENSION_POINT_ID = "specification";
	@Override
	public void setUp() throws Exception {
		super.setUp();
		
		this.context = new ClassPathXmlApplicationContext(new String[] {
				"MetadataBeansContext.xml",
				"file:tests/MetadataManager_JTA_DBContext_UnitTest.xml",
				"file:tests/DataSource_UnitTest.xml" });
	}

	@Override
	public void tearDown() throws Exception {
		super.tearDown();
	}

	public void testStart() {
		Properties properties = new Properties();
		String installFolder = "/opt/tandbergtv/cms/plugins";

		properties.put(JPF_PLUGIN_REPOSITORY_PROPERTY, installFolder);

		JPFActivator activator = new JPFActivator();
		activator.start(properties);
		
		PluginRegistry pluginRegistry = activator.getPluginManager().getRegistry();
		ExtensionPoint point = pluginRegistry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
		Collection<Extension> extensions = point.getAvailableExtensions();

		for (Extension extension : extensions) {
			System.out.println("" + extension.getDeclaringPluginDescriptor().getId());
		}
		
		SpecificationBuilder builder = new SpecificationBuilder(activator.getPluginManager(), context);
		
		builder.buildSpecifications();
		
		//putCL11();
		
		getCL11();

	}

	private void getCL11() {
		ISpecHandler handler = getSpecHandler();
		
		try {
			Document o = handler.get(createIdentifier(handler));
			print(o);
		} catch (MetadataException e) {
			e.printStackTrace();
		} catch (SearchException e) {
			e.printStackTrace();
		} catch (TranslationException e) {
			e.printStackTrace();
		}
		
	}

	protected IIdentifier createIdentifier(ISpecHandler handler){
		
		CL1_1_Identifier id = (CL1_1_Identifier) handler.getIdentifier();
		
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("indemand.com");
		id.setSearchService((AssetSearchService) context.getBean("assetSearch"));
		/*try {
			id.setMappingResourceUrl(new java.net.URL(o.getSpecIdentifiers().get(Spec.CL1_1.toString())));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		return id;
	}
	
	private void putCL11() {
		ISpecHandler handler = getSpecHandler();
		
		try {
			File file = new File("tests/com/tandbergtv/spec/sampleInput/cl1_1-sample_1.xml");
			System.out.println("put file:" + file);
			DocumentBuilder builder = null;
			Document input = null;
			try {
				builder = DocumentBuilderFactory.newInstance()
						.newDocumentBuilder();
				input = builder.parse(file);
			} catch (SAXException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			} catch (ParserConfigurationException e2) {
				e2.printStackTrace();
			}

			List<IIdentifier> ids = handler.put(input);
			System.out.println("Added doc which generated ids: ");
			for (IIdentifier id : ids) {
				System.out.println(id.toString());
			}
		} catch (MetadataException e) {
			e.printStackTrace();
		}

	}

	private ISpecHandler getSpecHandler() {
		SpecHandlerFactory specHandlerFactory = (SpecHandlerFactory) context.getBean("specHandlerFactory");
		return specHandlerFactory.getInstance("CL1_1");
	}
	
	
	private void print(Document doc) {
		// a search could have failed. So not printing the empty doc.
		if (doc == null) {
			fail("doc is null!");
		}
		try {
			OutputFormat format = new OutputFormat(doc);
			format.setIndenting(true);
			File outFile = new File("tests/output/output.xml");
			XMLSerializer serializer = new XMLSerializer(new FileOutputStream(
					outFile, false), format);
			serializer.serialize(doc);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
