package com.tandbergtv.metadata.test.search;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.tandbergtv.metadatamanager.search.AssetSearchService;
import com.tandbergtv.metadatamanager.search.FieldInfo;
import com.tandbergtv.metadatamanager.search.ListFieldInfo;
import com.tandbergtv.metadatamanager.search.LogicalOperator;
import com.tandbergtv.metadatamanager.search.MetadataValueFieldInfo;
import com.tandbergtv.metadatamanager.search.SearchField;
import com.tandbergtv.metadatamanager.search.SearchInfo;

public class SingleFieldOperatorSQLSearchTest extends TestCase {

	private ApplicationContext context;
	
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		
		try {
			this.context = new ClassPathXmlApplicationContext(new String[] {
					"MetadataBeansContext.xml",
					"file:tests/MetadataManager_JTA_DBContext_UnitTest.xml",
					"file:tests/DataSource_UnitTest.xml" });
		} catch (Exception e) {
			System.out.print(e);
		}
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
	}
	
	
	public void testUnparsableData() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo("/tns:Fields/tns:Version/tns:Major", LogicalOperator.CONTAINSUNPARSABLE, "");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Unparsable field search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDoesNotContainUnparsableData() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Version/tns:Major",
				LogicalOperator.DOESNOTCONTAINUNPARSABLE, "");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Parsable field search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDoesNotStartWith() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Title/tns:ShortTitle/tns:Value",
				LogicalOperator.DOESNOTSTARTWITH, "Demo");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'Does not start with' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testStartWith() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Title/tns:ShortTitle/tns:Value",
				LogicalOperator.STARTSWITH, "Demo");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'starts with' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testEndsWith() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Title/tns:ShortTitle/tns:Value",
				LogicalOperator.ENDSWITH, "Demo");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'Ends with' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDoesNotEndsWith() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Title/tns:ShortTitle/tns:Value",
				LogicalOperator.DOESNOTENDWITH, "Demo");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'Does not end with' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testIsNotEmpty() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:Title/tns:ShortTitle/tns:Value",
				LogicalOperator.ISNOTEMPTY, "");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'Is not empty' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testIsEmpty() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo(
				"/tns:Fields/tns:AssetClass",
				LogicalOperator.ISEMPTY, "");
		field.setAssetType("PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field 'Is empty' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testStringIn() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("Demo4");
		values.add("custom rule test");
		FieldInfo field = new ListFieldInfo("/tns:Fields/tns:AssetName", values);
		field.setAssetType("PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field value 'in' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testStringNotIn() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("Demo4");
		values.add("custom rule test");
		ListFieldInfo field = new ListFieldInfo("/tns:Fields/tns:AssetName", values, LogicalOperator.NOTIN, "PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field value 'not in' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testIntIn() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("Demo4");
		values.add("custom rule test");
		FieldInfo field = new ListFieldInfo("/tns:Fields/tns:AssetName", values);
		field.setAssetType("PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field value 'in' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testContains() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo("/tns:Fields/tns:AssetName", LogicalOperator.CONTAINS, "Demo");
		field.setAssetType("PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field value 'contains' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDoesNotContains() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo("/tns:Fields/tns:AssetName", LogicalOperator.DOESNOTCONTAIN, "Demo");
		field.setAssetType("PACKAGE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field value 'does not contain' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDateLessThanToday() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo("/tns:Fields/tns:Rights/tns:LicensingWindowEnd", LogicalOperator.LESSTHANTODAY, "3");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field date value 'less than today' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testDateIsEmpty() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		FieldInfo field = new MetadataValueFieldInfo("/tns:Fields/tns:Rights/tns:LicensingWindowStart", LogicalOperator.ISEMPTY, "");
		field.setAssetType("TITLE");
		fields.add(field);
		
		info.setFields(fields);

		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Field date value 'is empty' search query: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}
