package com.tandbergtv.metadatamanager;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import com.tandbergtv.metadatamanager.model.Field;
import com.tandbergtv.metadatamanager.model.FieldTree;
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 FieldTreeUnitTest extends TestCase {

	@Override
	public void setUp() throws Exception {
		super.setUp();
	}

	@Override
	public void tearDown() throws Exception {
		super.tearDown();
	}

	public void _testBuildFieldTree() {
		List<Field> fields = new ArrayList<Field>();

		fields.add(createField("/tns:Fields/tns:Rights/tns:LicensingWindowEnd",
				"--T00:00:00", "1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:Rights/tns:LicensingWindowStart",
				"--T00:00:00", "1,1,1"));

		fields.add(createField("/tns:Fields/tns:AssetName",
				"Captain Corellis Mandolin title", "1,1"));
		
		fields.add(createField("/tns:Fields/tns:Episode/tns:SeasonPremier",
				"true", "1,1,1"));

		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,1,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:Name", "Studio",
				"1,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:DisplayName",
				"100", "1,1,1,1"));

		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,2,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:Name", "Studio",
				"1,2,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:DisplayName",
				"100", "1,2,1,1"));

		fields.add(createField(
				"/tns:Fields/tns:ProviderInfo/tns:Identifier/tns:Id",
				"indemand", "1,1,1,1"));

		fields.add(createField(
				"/tns:Fields/tns:Episode/tns:Name/tns:Language/@value",
				"indemand", "1,1,1,1,1"));

		
		fields
		.add(createField(
				"/tns:Fields/tns:CustomFields/tns:CustomField[@name=abc]/tns:CustomField[@name=qqq]/@value",
				"abcValue", "1,1,1,1"));

		fields
		.add(createField(
				"/tns:Fields/tns:CustomFields/tns:CustomField[@name=xyz]/@value",
				"xyzValue", "1,1,1"));

		
		Item item = new Item();
		item.setFields(fields);
		FieldTree fieldTree = item.getFieldTree();
		int size = fieldTree.getRootElement().getChildren().size();
		System.out.println("Number of First Level Children == " + size);
		System.out.println(fieldTree.toString());
		
		item.setFieldTree(fieldTree);
		
		for (Field f : item.getFields()) {
			System.out.println("xpath == " + f.getTtvXPath() + " -- value == " + f.getValue() + " -- index == " + f.getIndices().toString());
		}
	}

	public void _testSearchXpath() {

		List<Field> groupFields = new ArrayList<Field>();
		Group group = new Group();
		group.setType(GroupType.PACKAGE);
		
		groupFields.add(createField(
				"/tns:Fields/tns:ProviderInfo/tns:Identifier/tns:Id",
				"indemand", "1,1,1,1"));
		group.setFields(groupFields);
		
		
		List<Field> fields = new ArrayList<Field>();

		fields.add(createField("/tns:Fields/tns:Rights/tns:LicensingWindowEnd",
				"--T00:00:00", "1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:Rights/tns:LicensingWindowStart",
				"--T00:00:00", "1,1,1"));

	/*	fields.add(createField("/tns:Fields/tns:AssetName",
				"Captain Corellis Mandolin title", "1,1"));*/
		
		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,1,1,1,1"));
		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,2,1,1,1"));

		Item item = new Item();
		item.setType(ItemType.MOVIE);
		item.setFields(fields);

		group.addChild(item);

		
		
		
		List<Field> fields1 = new ArrayList<Field>();

		fields1.add(createField("/tns:Fields/tns:Rights/tns:LicensingWindowEnd",
				"--T00:00:00", "1,1,1"));
		fields1.add(createField(
				"/tns:Fields/tns:Rights/tns:LicensingWindowStart",
				"--T00:00:00", "1,1,1"));

		fields1.add(createField("/tns:Fields/tns:AssetName",
				"Captain Corellis Mandolin title", "1,1"));
		
		fields1
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,1,1,1,1"));
		fields1
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,2,1,1,1"));

		Item item1 = new Item();
		item1.setType(ItemType.MOVIE);
		item1.setFields(fields1);

		group.addChild(item1);

		
		List<FieldTree> treelist = group.getFieldTreeForXpath("MOVIE", "/tns:Fields/tns:Rights");
		
		if(treelist != null) {
			for(FieldTree tree : treelist) {
				System.out.println("Tree Found:");
				System.out.println(tree.toString());
				System.out.println("\n");
			}
		}
	}

	public void testDepthFirstTraversal() {
		List<Field> fields = new ArrayList<Field>();

		fields.add(createField("/tns:Fields/tns:Rights/tns:LicensingWindowEnd",
				"--T00:00:00", "1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:Rights/tns:LicensingWindowStart",
				"--T00:00:00", "1,1,1"));

		fields.add(createField("/tns:Fields/tns:AssetName",
				"Captain Corellis Mandolin title", "1,1"));
		
		fields.add(createField("/tns:Fields/tns:Episode/tns:SeasonPremier",
				"true", "1,1,1"));

		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,1,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:Name", "Studio",
				"1,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:DisplayName",
				"100", "1,1,1,1"));

		fields
				.add(createField(
						"/tns:Fields/tns:CreationInfo/tns:Studio/tns:RoyaltyInfo/tns:RoyaltyMinimum",
						"100", "1,2,1,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:Name", "Studio",
				"1,2,1,1"));
		fields.add(createField(
				"/tns:Fields/tns:CreationInfo/tns:Studio/tns:DisplayName",
				"100", "1,2,1,1"));

		fields.add(createField(
				"/tns:Fields/tns:ProviderInfo/tns:Identifier/tns:Id",
				"indemand", "1,1,1,1"));

		fields.add(createField(
				"/tns:Fields/tns:Episode/tns:Name/tns:Language/@value",
				"indemand", "1,1,1,1,1"));

		
		fields
		.add(createField(
				"/tns:Fields/tns:CustomFields/tns:CustomField[@name=abc]/tns:CustomField[@name=qqq]/@value",
				"abcValue", "1,1,1,1"));

		fields
		.add(createField(
				"/tns:Fields/tns:CustomFields/tns:CustomField[@name=xyz]/@value",
				"xyzValue", "1,1,1"));

		
		Item item = new Item();
		item.setType("MOVIE");
		item.setFields(fields);
		List<FieldTree> ftList = item.getFieldTreeForXpath("MOVIE",
				"/tns:Fields/tns:CreationInfo/tns:Studio");
		for(FieldTree ft : ftList) {
			List<Field> funFields = ft.depthFirstTraversal();
			for(Field f : funFields) {
				System.out.println(f.getTtvXPath());
			}
		}
	}
	
	private Field createField(String xpath, String value, String indices) {
		Field f = new Field();
		f.setTtvXPath(xpath);
		f.setValue(value);

		String[] i = indices.split(",");
		for (String index : i) {
			f.getIndices().add(Integer.parseInt(index));
		}

		return f;
	}
}
