package com.tandbergtv.spec;

import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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.MetadataManagerDAO;
import com.tandbergtv.metadatamanager.exception.MetadataException;
import com.tandbergtv.metadatamanager.exception.SearchException;
import com.tandbergtv.metadatamanager.factoryImpl.SpecHandlerFactory;
import com.tandbergtv.metadatamanager.model.Asset;
import com.tandbergtv.metadatamanager.model.Field;
import com.tandbergtv.metadatamanager.model.FieldRevision;
import com.tandbergtv.metadatamanager.model.Group;
import com.tandbergtv.metadatamanager.model.RootAssetRevision;
import com.tandbergtv.metadatamanager.model.Spec;
import com.tandbergtv.metadatamanager.model.Group.GroupType;
import com.tandbergtv.metadatamanager.spec.IIdentifier;
import com.tandbergtv.metadatamanager.spec.ISpecHandler;
import com.tandbergtv.metadatamanager.specimpl.cl1_1.CL1_1_Identifier;
import com.tandbergtv.metadatamanager.specimpl.ttv.TTVId;

/**
 * Test class to verify Spec handler base.
 * 
 * @author spuranik
 * 
 */
public class CL1_1HandlerTest extends BaseHandlerTest {

	protected static final String LARGE_VALUE = "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";
	protected static String testFilePathAndName= "tests/com/tandbergtv/spec/sampleInput/cl1_1-sample";
	
	@Override
	protected ISpecHandler createSpecHandler() {
		return SpecHandlerFactory.getInstance("CL1_1");
	}

	@Override
	protected String getSpecName() {
		return "CL1_1";
	}
	
	protected IIdentifier createIdentifier(){
		CL1_1_Identifier id = (CL1_1_Identifier) createSpecHandler().getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("indemand.com");
		return id;
	}
	
	public void _testPut(){
		int fileIndexStart=1;
		int fileIndexEnd = 1;
		putMutiple(testFilePathAndName, fileIndexStart, fileIndexEnd);
	}

	public void _testSaveIncremental() {
		ISpecHandler handler = createSpecHandler();
		try {
			File file = new File(
					"tests/com/tandbergtv/spec/cl1_1-sample_small.xml");
			DocumentBuilder builder = null;
			Document input = null;
			try {
				builder = DocumentBuilderFactory.newInstance()
						.newDocumentBuilder();
				builder.setEntityResolver(new ADIDTDEntityResolver());
				input = builder.parse(file);
			} catch (SAXException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			} catch (ParserConfigurationException e2) {
				e2.printStackTrace();
			}

			List<Asset> assets = handler.incrementalSave(input);
			System.out.println("Added doc which generated ids: ");
			for (Asset a : assets) {
				System.out.print(" [TTV id = ");
				System.out.print(a.getId());
				System.out.print("]");
			}
		} catch (MetadataException e) {
			e.printStackTrace();
		}
	}

	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);
		}
	}

	public void _testGetByIdentiferAndVersion( int revisionNumber) {
		getAssetDocByIdentifierAndRevision(createIdentifier(), EXTERNAL_REVISION_TEST_EXTERNAL + "." + revisionNumber);
	}
	
	public void _testGetByIdentifer() {
		getAssetDocByIdentifierAndRevision(createIdentifier(), null);
	}
	
	public void _testGetByInternalVersion(int internalVersion){
		TransactionStatus status = txmgr
		.getTransaction(new DefaultTransactionDefinition(
				PROPAGATION_REQUIRED));
		MetadataManagerDAO dao = (MetadataManagerDAO) context.getBean("metadataManagerDAOImpl");
		try {
			Asset asset = dao.getAsset(new TTVId(1),internalVersion, true, true);
//			Document document = new Binder().bind(asset);
//			
//			OutputFormat format = new OutputFormat(document);
//			format.setIndenting(true);
//			java.io.File outFile = new java.io.File("tests/output/CL1_1_DAO_output" + "-" + internalVersion + ".xml");
//			XMLSerializer serializer = new XMLSerializer(new FileOutputStream(
//					outFile, false), format);
//			serializer.serialize(document);
			System.out.println("asset is: " + asset);
		} catch (Exception e) {
			e.printStackTrace();
			fail();
			
		}
		txmgr.commit(status);
	}

	public void _testGetUndeletedFields(){
		MetadataManagerDAO dao = (MetadataManagerDAO) context.getBean("metadataManagerDAOImpl");
		try {
			Asset asset = dao.getAsset(new TTVId(1), true, true);
			List<FieldRevision> fields = asset.getFieldRevisions();
			for(FieldRevision field : fields){
				if("/tns:Fields/tns:Description/tns:Text".equals(field.getTtvXPath())){
						List<FieldRevision> unDeletedFields = dao.getUnDeletedFieldRevsions(field);
						System.out.println(unDeletedFields);
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void _testGetAllRevisionsByIdentifier(){
		CL1_1_Identifier id = (CL1_1_Identifier) createSpecHandler().getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("indemand.com");

		getAllRevisionsByIdentifier(id);
	}


	public void _testDeleteUnique() {
		CL1_1_Identifier id = (CL1_1_Identifier) createSpecHandler().getIdentifier();
		id.setAssetId("UNVA2001081701003002");
		id.setProviderId("indemand.com");

		try {
			ISpecHandler handler = createSpecHandler();
			handler.deleteUnique(id);
		} catch (SearchException e) {
			e.printStackTrace();
		}
	}

	public void _testDeleteAll() {
		List<IIdentifier> ids = new ArrayList<IIdentifier>();

		CL1_1_Identifier id1 = (CL1_1_Identifier) createSpecHandler().getIdentifier();
		id1.setAssetId("UNVA2001081701003000");
		id1.setProviderId("indemand.com");

		CL1_1_Identifier id2 = (CL1_1_Identifier) createSpecHandler().getIdentifier();
		id2.setAssetId("Group3");
		id2.setProviderId("indemand.com");

		ids.add(id2);

		ISpecHandler handler = createSpecHandler();
		List<IIdentifier> deletedIds = handler.deleteAll(ids);

		if (deletedIds.size() == 0) {
			System.out.println("No assets were deleted.");
		} else {
			for (IIdentifier deletedId : deletedIds) {
				System.out.println("Deleted asset with id: "
						+ deletedId.toString());
			}
		}
	}

	public void _testRollback(){
		rollback(1, EXTERNAL_REVISION_TEST_EXTERNAL +"."+  2);
	}

	public void _testPutRollbackGetAllRevisions(){	
//		
//		TransactionStatus status = txmgr
//		.getTransaction(new DefaultTransactionDefinition(
//				PROPAGATION_REQUIRED));
//		
		
//		getIdentifiers(testFilePathAndName, 1);
//		putMutiple(testFilePathAndName, 1, 2);
//		putMutiple(testFilePathAndName, 2, 2);
//		_testGetByIdentiferAndVersion(1);
//		_testGetByIdentifer();
//		getAllRevisionsByIdentifier(createIdentifier());
//		_testGetByInternalVersion(2);
//		putRollbackGetAllRevisions(testFilePathAndName, 1, 4, 1, EXTERNAL_REVISION_TEST_EXTERNAL + "." +3, createIdentifier());
//		getAllRevisionsByIdentifier(createIdentifier());
//		_testDAOSave();
		
//		_testRollback();
		
		
//		txmgr.commit(status);
	}
	
	public void _testGetSpecName() {
		File file = new File("tests/com/tandbergtv/spec/sampleInput/cl1_1-sample.xml");
		DocumentBuilder builder = null;
		Document input = null;
		try {
			builder = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder();
			input = builder.parse(file);
			ISpecHandler handler = createSpecHandler();
			Spec spec = handler.getSpecName(input);
			assertNotNull(spec);
			System.out.println("Spec == " + spec.toString());
			assertEquals("CL1_1", spec.toString());
			
		} catch (SAXException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (ParserConfigurationException e2) {
			e2.printStackTrace();
		}
	}

	private Asset createSingleAssetWithLargeValue(int id) {
		Group g = new Group();
		if (id > 0)
			g.setId(id);

		ArrayList<Integer> indicesTwo = new ArrayList<Integer>();
		indicesTwo.add(1);
		indicesTwo.add(1);
		
		ArrayList<Integer> indicesThree = new ArrayList<Integer>();
		indicesThree.add(1);
		indicesThree.add(1);
		indicesThree.add(1);
		
		ArrayList<Integer> indicesFour = new ArrayList<Integer>();
		indicesFour.add(1);
		indicesFour.add(1);
		indicesFour.add(1);
		indicesFour.add(1);
		
		g.setType(GroupType.PACKAGE);

		Field fAssetName = new Field();
		fAssetName.setTtvXPath("/tns:Fields/tns:AssetName");
		fAssetName.setValue("mao");
		
		fAssetName.setIndices(indicesTwo);

		Field fAssetClass = new Field();
		fAssetClass.setTtvXPath("/tns:Fields/tns:AssetClass");
		fAssetClass.setValue("PACKAGE");
		fAssetClass.setIndices(indicesTwo);

		
		
		Field fDesc = new Field();
		fDesc.setTtvXPath("tns:Fields/tns:Description/tns:Text");
		fDesc.setValue(LARGE_VALUE);
		fDesc.setIndices(indicesFour);
		
		
		Field fIdentifier = new Field();
		fIdentifier.setTtvXPath("/tns:Fields/tns:Identifier/Id");
		fIdentifier.setValue("ThuM2620091509420522.2");		
		fIdentifier.setIndices(indicesThree);
		
		

		Field fProviderInfoIdentifier = new Field();
		fProviderInfoIdentifier
				.setTtvXPath("/tns:Fields/tns:ProviderInfo/tns:Identifier/Id");
		fProviderInfoIdentifier.setValue("someProvider.com");
		
		fProviderInfoIdentifier.setIndices(indicesFour);

		g.addField(fAssetName);
//		g.addField(fAssetClass);
		g.addField(fDesc);
//		g.addField(fIdentifier);
//		g.addField(fProviderInfoIdentifier);

		return g;
	}
	
	public void _testDAO(){
		TransactionStatus status = txmgr
		.getTransaction(new DefaultTransactionDefinition(
				PROPAGATION_REQUIRED));
		MetadataManagerDAO dao = (MetadataManagerDAO) context.getBean("metadataManagerDAOImpl");
		try {
//			TTVId id = dao.saveAsset(createSingleAssetWithLargeValue(0));
//			System.out.println(" saved id: " + id );
			Asset asset= dao.getAsset(new TTVId(1), true, true);
			System.out.println("Asset got is: " + asset);
			
		} catch (Exception e) {
			fail();
			e.printStackTrace();
		}
		txmgr.commit(status);
	}
	
	public void _testBug4900(){
		ISpecHandler cl1SpecHandler = createSpecHandler();
		CL1_1_Identifier id = (CL1_1_Identifier) cl1SpecHandler.getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("4900");
		
		
		//put initial, modify Movie Desc
		putMutiple("tests/com/tandbergtv/spec/sampleInput/cl1_4900", 1, 2);
		
		
		
		try {
			TTVId ttvid = id.getAssetTTVId();
			//rollback
			rollback(ttvid.getId(), EXTERNAL_REVISION_TEST_EXTERNAL + "." +1);
			
		} catch (SearchException e) {
			e.printStackTrace();
			fail();
		}
		
		putMutiple("tests/com/tandbergtv/spec/sampleInput/cl1_4900", 3, 3);
		
		List<RootAssetRevision> revisions = getAllRevisionsByIdentifier(id);
		assertEquals(4, revisions.size());
		
		//check version 4 Movie.Description
		Document doc = getAssetDocByIdentifierAndRevision(id, null);
		String docString = convertAssetDocToString(doc);
		assertTrue("Version 4 of Movie.Description is not correct: \n " + docString,  docString.contains("4900MovieDesc_Modified_2"));
		
		//check version 3 Movie.Description
		 doc = getAssetDocByIdentifierAndRevision(id, EXTERNAL_REVISION_TEST_EXTERNAL + "." +3);
		 docString = convertAssetDocToString(doc);
		 assertTrue("Version 4 of Movie.Description is not correct:\n" + docString,  docString.contains("4900MovieDesc_Original"));
		
		//check version 2 Movie.Description
		 doc = getAssetDocByIdentifierAndRevision(id, EXTERNAL_REVISION_TEST_EXTERNAL + "." +2);
		 docString = convertAssetDocToString(doc);
		 assertTrue("Version 4 of Movie.Description is not correct:\n"+ docString,  docString.contains("4900MovieDesc_Modified_1"));
		
		//check version 1 Movie.Description
		 doc = getAssetDocByIdentifierAndRevision(id, EXTERNAL_REVISION_TEST_EXTERNAL + "." +1);
		 docString = convertAssetDocToString(doc);
		 assertTrue("Version 4 of Movie.Description is not correct:\n"+ docString,  docString.contains("4900MovieDesc_Original"));
	}
	
	
	public void _testBug4972(){
		String docString = cl11PutMultipleGetLatest("4972", "tests/com/tandbergtv/spec/sampleInput/cl1_4972", 1, 1);
		assertTrue("movie.Audio_Type should contain '4972Audio_Type-Stereo', but it's: \n " + docString,  docString.contains("4972Audio_Type-Stereo"));
		
	}
	
	public void _testBug3469(){
		Pattern p = Pattern.compile("3469Category[1]{300}");
		
		ISpecHandler cl1SpecHandler = createSpecHandler();
		CL1_1_Identifier id = (CL1_1_Identifier) cl1SpecHandler.getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("3469");
		id.setSearchService(searchService);
		
		System.out.println(id.getSearchService());
		
		
		//put initial
		putMutiple("tests/com/tandbergtv/spec/sampleInput/cl1_3469", 1, 1);
		
		//check result
		
		try {
			TTVId ttvid = id.getAssetTTVId();
			ttvid.setSearchService(searchService);

			Document doc = getAssetDocByIdentifierAndRevision(cl1SpecHandler, ttvid, null);
			String docString = convertAssetDocToString(doc);
			Matcher m = p.matcher(docString);
			assertTrue("title.Category should contain '3469Category[1]{300}',i.e. more than 256 characters, but it's: \n " + docString,  m.find());
			
		
		} catch (SearchException e) {
			e.printStackTrace();
			fail();
		}
		
	}
	
	public void _testbug3502(){
		String docString = cl11PutMultipleGetLatest("3502", "tests/com/tandbergtv/spec/sampleInput/cl1_3502", 1, 2);

		assertTrue("encrypted.Asset_Encrypted should be delted upon merge, but it's not: \n " + docString,  !docString.contains("3502-Asset_Encrypted_initValue"));
		
	}
	
	//TODO wait on clarification
	public void _testbug3509(){
		ISpecHandler cl1SpecHandler = createSpecHandler();
		CL1_1_Identifier id = (CL1_1_Identifier) cl1SpecHandler.getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId("3509");
		
		
		//put initial
		putMutiple("tests/com/tandbergtv/spec/sampleInput/cl1_3509", 1, 1);
		
		//check result
		Document doc = getAssetDocByIdentifierAndRevision(id, null);
		String docString = convertAssetDocToString(doc);
		System.out.println(docString);
//		assertTrue("encrypted.Asset_Encrypted should be delted upon merge, but it's not: \n " + docString,  !docString.contains("3502-Asset_Encrypted_initValue"));
		
	}

	protected String cl11PutMultipleGetLatest(String providerId, String inputFilePrefix,
			int inputFileStartIndex, int inputFileEndIndex) {
		
		ISpecHandler cl1SpecHandler = createSpecHandler();
		CL1_1_Identifier id = (CL1_1_Identifier) cl1SpecHandler.getIdentifier();
		id.setAssetId("UNVA2001081701003000");
		id.setProviderId(providerId);
		
		return super.putMultipleGetLatest(inputFilePrefix, inputFileStartIndex,
				inputFileEndIndex, id);
	}
	
	
	public void _testbug3871(){
		String latestDocStr = cl11PutMultipleGetLatest("3871", "tests/com/tandbergtv/spec/sampleInput/cl1_3871", 1, 2);

		assertTrue("Unparsable Date value('3871_DateDataType_Unparsable') should be saved as it is, but it's not: \n ",  latestDocStr.contains("3871_DateDataType_Unparsable"));
		assertTrue("Unparsable Integer value('3871_IntegerDataType_Unparsable') should be saved as it is, but it's not: \n ",  latestDocStr.contains("3871_IntegerDataType_Unparsable"));
		assertTrue("Unparsable Float value('3871_FloatDataType_Unparsable') should be saved as it is, but it's not: \n ",  latestDocStr.contains("3871_FloatDataType_Unparsable"));
		
	}
	
	
	public void _testbug4390(){
		String latestDocStr = cl11PutMultipleGetLatest("4390", "tests/com/tandbergtv/spec/sampleInput/cl1_4390", 1, 2);

		assertTrue("title.Episode_Name'value('4390_Episode_Name_value') should be deleted upon merge, but it's not: \n ",  !latestDocStr.contains("4390_Episode_Name_value"));
	}

	public void testbug4777(){
		String latestDocStr = cl11PutMultipleGetLatest("4777", "tests/com/tandbergtv/spec/sampleInput/cl1_4777", 1, 2);

		assertTrue("movie.CUST'value('4777_CUST_INIT') should be deleted upon merge, but it's not: \n ",  !latestDocStr.contains("4777_CUST_INIT"));
	}

}
