/**
 * 
 */
package com.tandbergtv.spec;

import static com.tandbergtv.metadatamanager.model.FieldName.FILE_NAME;
import static com.tandbergtv.metadatamanager.model.FieldName.FILE_URL;
import static com.tandbergtv.metadatamanager.model.FieldName.MIME_TYPE;
import static com.tandbergtv.metadatamanager.model.FieldName.RESOLUTION;
import static com.tandbergtv.metadatamanager.model.FieldName.SIZE;
import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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.junit.After;
import org.junit.Before;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.tandbergtv.metadatamanager.ITTVDataModelHandler;
import com.tandbergtv.metadatamanager.JPFActivator;
import com.tandbergtv.metadatamanager.conf.SpecificationBuilder;
import com.tandbergtv.metadatamanager.exception.MetadataException;
import com.tandbergtv.metadatamanager.factoryImpl.SpecHandlerFactory;
import com.tandbergtv.metadatamanager.model.Asset;
import com.tandbergtv.metadatamanager.model.Field;
import com.tandbergtv.metadatamanager.model.FileType;
import com.tandbergtv.metadatamanager.model.Item.ItemType;
import com.tandbergtv.metadatamanager.spec.ISpecHandler;

/**
 * @author vaibhav
 * 
 */
public class PMMTemplateUnitTest extends TestCase {
	private ApplicationContext context;
	private PlatformTransactionManager txmgr;

	private static final String JPF_PLUGIN_REPOSITORY_PROPERTY = "org.java.plugin.boot.pluginsRepositories";
	
	@Before
	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" });
		
		txmgr = (PlatformTransactionManager) context
		.getBean("transactionManager");
		
		Properties properties = new Properties();
		String installFolder = "/opt/tandbergtv/cms/plugins";

		properties.put(JPF_PLUGIN_REPOSITORY_PROPERTY, installFolder);

		
		JPFActivator activator = new JPFActivator();
		activator.start(properties);
		
		SpecificationBuilder builder = new SpecificationBuilder(activator.getPluginManager(), context);
		
		builder.buildSpecifications();

	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		super.tearDown();
	}

	private ISpecHandler getSpecHandler(String spec) {
/*		SpecHandlerFactory factory = (SpecHandlerFactory) context
				.getBean("specHandlerFactory");
		return factory.getInstance(spec);
		
*/		return SpecHandlerFactory.getInstance(spec);
	}

	public void testPMMScenario() {
		ISpecHandler handler = getSpecHandler("CL1_1");
		
		File file = new File("tests/com/tandbergtv/spec/sampleInput/cl1_1-sample_1.xml");
		DocumentBuilder builder = null;
		Document input = null;
		try {
			
			TransactionStatus status = txmgr
			.getTransaction(new DefaultTransactionDefinition(
					PROPAGATION_REQUIRED));

			
			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			builder.setEntityResolver(new ADIDTDEntityResolver());
			input = builder.parse(file);
			
			List<Asset> mergedAssets = handler.mergeWithoutSave(input);
			Asset mergedAsset = mergedAssets.get(0);
			
			com.tandbergtv.metadatamanager.model.File fileItem = createfile();
			
			mergedAsset.addChild(fileItem);
			
			ITTVDataModelHandler ttvhandler = getDataModelHandler(); 
			ttvhandler.saveAsset(mergedAsset, false);
			
			txmgr.commit(status);
			
		} catch (SAXException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (ParserConfigurationException e2) {
			e2.printStackTrace();
		} catch (MetadataException e) {
			e.printStackTrace();
		}
	}
	
	
	com.tandbergtv.metadatamanager.model.File createfile() {
		com.tandbergtv.metadatamanager.model.File file = new com.tandbergtv.metadatamanager.model.File();
		
		file.setType(ItemType.VIDEO);
		file.setFileType(FileType.ORIGINAL);
		
		file.addField(new Field(FILE_URL.toString(), "rtsp://rtsp2.youtube.com/ChoLENy73wIaEQlbwqbpvT6ZzhMYDSANFEgGDA==/0/0/0/video.3gp"));
		file.addField(new Field(FILE_NAME.toString(), "ChoLENy73wIaEQlbwqbpvT6ZzhMYDSANFEgGDA==/0/0/0/video.3gp"));
		file.addField(new Field(MIME_TYPE.toString(), "video/3gpp"));
		file.addField(new Field(RESOLUTION.toString(), "1920.0x1080.0"));
		file.addField(new Field(SIZE.toString(), "26010364"));
		
		return file;
	}
	
	ITTVDataModelHandler getDataModelHandler() {
		ITTVDataModelHandler handler = (ITTVDataModelHandler) context.getBean("TTVSpecHandler");
		
		return handler;
	}
	
	class ADIDTDEntityResolver implements EntityResolver {
		public InputSource resolveEntity(String publicId, String systemId) throws SAXException, java.io.IOException {
			InputStream s = this.getClass().getClassLoader().getResourceAsStream("com/tandbergtv/spec/ADI.DTD");
			return new InputSource(s);
		}
	}
}
