package com.tandbergtv.config;

import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED;

import java.util.ArrayList;

import org.junit.Test;
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 com.tandbergtv.metadatamanager.MetadataManagerDAO;
import com.tandbergtv.metadatamanager.exception.MetadataException;
import com.tandbergtv.metadatamanager.model.Field;
import com.tandbergtv.metadatamanager.model.Group;
import com.tandbergtv.metadatamanager.model.Item;
import com.tandbergtv.metadatamanager.model.Group.GroupType;
import com.tandbergtv.metadatamanager.model.Item.ItemType;

public class CMTTests {

	@Test
	public void _testIncompleteTransaction() {
		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {
				"MetadataBeansContext.xml",
				"MetadataManagerDBContext.xml",
				"file:tests/DataSource_UnitTest.xml" });

		MetadataManagerDAO daoImpl = (MetadataManagerDAO) context
				.getBean("metadataManagerDAOImpl");

		PlatformTransactionManager txMgr = (PlatformTransactionManager) context
				.getBean("transactionManager");
		txMgr.getTransaction(new DefaultTransactionDefinition(
				PROPAGATION_REQUIRED));
		addAssets(daoImpl);
		throw new RuntimeException("Simply throwing an exception.");
	}

	@Test
	public void testCompletedTransaction() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "MetadataBeansContext.xml",
						"MetadataManagerDBContext.xml",
						"file:tests/DataSource_UnitTest.xml" });

		MetadataManagerDAO daoImpl = (MetadataManagerDAO) context
				.getBean("metadataManagerDAOImpl");

		PlatformTransactionManager txMgr = (PlatformTransactionManager) context
				.getBean("transactionManager");
		TransactionStatus status = txMgr
				.getTransaction(new DefaultTransactionDefinition(
						PROPAGATION_REQUIRED));

		addAssets(daoImpl);
		txMgr.commit(status);
	}

	private void addAssets(MetadataManagerDAO daoImpl) {
		Group g = new Group();
		g.setType(GroupType.PACKAGE);

		g.addField(createField("Fields/AssetName",
				"CaptainCorellisMandolinpackage"));
		g.addField(createField("Fields/AssetClass", "package"));
		g.addField(createField("Fields/Description/Text",
				"Captain Corellis Mandolin asset package"));
		g.addField(createField("Fields/Identifier/Id",
				"OutbreakWVC12242528x4802398pWMA129wmv"));
		g.addField(createField("Fields/ProviderInfo/Identifier/Id",
				"indemand.com"));
		g.addField(createField("Fields/ProviderInfo/Identifier/Name",
				"In Demand"));

		// Title
		Item it = new Item();
		it.setType(ItemType.TITLE);

		it.addField(createField("Fields/AssetName",
				"Captain Corellis Mandolin title"));
		it.addField(createField("Fields/AssetClass", "title"));
		it.addField(createField("Fields/Description/Text",
				"Captain Corellis Mandolin title asset"));
		it
				.addField(createField("Fields/Identifier/Id",
						"UNVA2001081701003001"));
		it.addField(createField("Fields/BillingInfo/SuggestedPrice/Value",
				"3.95"));

		// Movie
		Item im = new Item();
		im.setType(ItemType.MOVIE);

		im.addField(createField("Fields/AssetName",
				"Captain Corellis Mandolin feature"));
		im.addField(createField("Fields/AssetClass", "movie"));
		im
				.addField(createField("Fields/Identifier/Id",
						"UNVA2001081701003002"));
		im
				.addField(createField("Fields/Content/Locator/Uri",
						"MandolinTR.mpg"));
		im.addField(createField("Fields/ProviderInfo/Identifier/Id",
				"indemand.com"));
		im.addField(createField("Fields/ProviderInfo/Identifier/Name",
				"In Demand"));
		im.addField(createField("Fields/ProductInfo/Name", "MOD"));

		// Preview
		Item ip = new Item();
		ip.setType(ItemType.PREVIEW);

		im.addField(createField("Fields/AssetName",
				"Captain Corellis Mandolin trailer"));
		im.addField(createField("Fields/AssetClass", "preview"));
		im
				.addField(createField("Fields/Identifier/Id",
						"UNVA2001081701003003"));
		im.addField(createField("Fields/Content/Locator/Uri", "Mandolin.mpg"));
		im.addField(createField("Fields/ProviderInfo/Identifier/Id",
				"indemand.com"));
		im.addField(createField("Fields/ProviderInfo/Identifier/Name",
				"In Demand"));

		g.addChild(it);
		g.addChild(im);
		g.addChild(ip);

		try {
			daoImpl.saveAsset(g);
		} catch (MetadataException e) {
			e.printStackTrace();
		}
	}

	private Field createField(String xpath, String value) {
		Field f = new Field();
		f.setTtvXPath(xpath);
		f.setValue(value);

		String[] a = xpath.split("/");
		ArrayList<Integer> indices = new ArrayList<Integer>(a.length);
		for (int i = 0; i < a.length; i++) {
			indices.add(new Integer(1));
		}

		f.setIndices(indices);

		return f;
	}
}
