package com.tandbergtv.binder;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;

import junit.framework.TestCase;

import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.tandbergtv.metadatamanager.model.Asset;
import com.tandbergtv.metadatamanager.util.Binder;
import com.tandbergtv.metadatamanager.util.XmlUtil;


public class BinderUnitTest extends TestCase {

	/**
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	@Test
	public static void testBinder() throws ParserConfigurationException, SAXException, IOException {

		File file = new File("tests/com/tandbergtv/binder/binder-test-small.xml");
		DocumentBuilder builder = XmlUtil.createDocumentBuilder();
		Document doc = builder.parse(file);
		
		NodeList nodeList = doc.getDocumentElement().getChildNodes();
		for(int i = 0; i < nodeList.getLength(); i++){
			Node node = nodeList.item(i);
			if (node.getNodeType() != Node.ELEMENT_NODE)
				continue;
			Element element = (Element) node;
			printNode(i, element);
			System.out.println("\n\n");
			NodeList children = element.getChildNodes();
			for (int i1 = 0; i1 < children.getLength(); i1++) {
				Node elementChild = children.item(i1);
				printNode(i1, elementChild);
			}
		}

		List<Asset> unroled = new Binder().bind(doc);

		for(Asset asset : unroled) {
			System.out.println(asset.toString());
		}

		Assert.assertNotNull(unroled);
		Assert.assertFalse(unroled.isEmpty());
		Assert.assertTrue(unroled.size() == 1);

//		Document doc2 = new Binder().bind(unroled);
//
//		Assert.assertNotNull(doc2);
//
//		List<Asset> unroled2 = new Binder().bind(doc2);
//
//		Assert.assertNotNull(unroled2);
//
//		StringWriter out = new StringWriter(); 
//		XMLSerializer serializer = new XMLSerializer(out, new OutputFormat(doc2)); 
//		serializer.serialize(doc2); 
//		String result = out.toString();
//
//		System.out.println(result);
	}
	
	
	@Test
	public static void _testDocBuilder() throws ParserConfigurationException, SAXException, IOException {

		File file = new File("tests/com/tandbergtv/binder/binder-test-noSchemaRef.xml");
		DocumentBuilder builder = XmlUtil.createDocumentBuilder();
		Document doc = builder.parse(file);

		NodeList nodeList = doc.getDocumentElement().getChildNodes();
		for(int i = 0; i < nodeList.getLength(); i++){
			Node node = nodeList.item(i);
			if (node.getNodeType() != Node.ELEMENT_NODE)
				continue;
			Element element = (Element) node;
			printNode(i, element);
			
			NodeList children = element.getChildNodes();
			for (int i1 = 0; i1 < children.getLength(); i1++) {
				Node elementChild = children.item(i1);
				printNode(i1, elementChild);
			}
		}
	}
	
	protected static void printNode(int elementIndex, Node element){
		System.out.println("node #" + elementIndex +": \n localName: " + element.getLocalName()
				+ "\n baseURI: " + element.getBaseURI() 
				+ "\n nameSpaceURI: " + element.getNamespaceURI()
				+ "\n nodeName: " + element.getNodeName()
				+ "\n nodeType: " + element.getNodeType()
				+ "\n nodeValue: " + element.getNodeValue()
		);
	}
}
