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.model.Asset;
import com.tandbergtv.metadatamanager.search.AssetSearchService;
import com.tandbergtv.metadatamanager.search.LogicalOperator;
import com.tandbergtv.metadatamanager.search.MetadataValueFieldInfo;
import com.tandbergtv.metadatamanager.search.PropertyValueField;
import com.tandbergtv.metadatamanager.search.SearchField;
import com.tandbergtv.metadatamanager.search.SearchInfo;

public class AssetLevelSearchTest extends TestCase {

	private ApplicationContext context;

	@Override
	public 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
	public void tearDown() throws Exception {
		super.tearDown();
	}
	
	public void testSearchMissingAssetType() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("PREVIEW");
		
		PropertyValueField field = new PropertyValueField("type", values,
				LogicalOperator.ISEMPTY, Asset.class);
		
		fields.add(field);
		info.setFields(fields);
		
		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Search query for assets with no PREVIEW: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}		
	}
	
	public void testSearchWithAssetType() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("PREVIEW");
		
		PropertyValueField field = new PropertyValueField("type", values,
				LogicalOperator.ISNOTEMPTY, Asset.class);
		
		fields.add(field);
		info.setFields(fields);
		
		try {
			AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
			String query = service.getQuery("searchResults", "sortResults", info, null);
			System.out.println("Search query for assets with PREVIEW: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}		
	}
	
	public void testSearchPackage(){
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		MetadataValueFieldInfo field = new MetadataValueFieldInfo("", LogicalOperator.CONTAINSUNPARSABLE, "");
		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("Search query for assets with unparsable PACKAGE: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}		
	}
	
	public void testAssetTypeWithUnparsableData() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		MetadataValueFieldInfo field = new MetadataValueFieldInfo("", 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("Search query for assets with unparsable TITLE asset: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}		
	}
	
	public void testAssetTypeDoesNotContainUnparsable() {
		SearchInfo info = new SearchInfo();
		List<SearchField> fields = new ArrayList<SearchField>();
		
		List<String> values = new ArrayList<String>();
		values.add("MOVIE");
		
		MetadataValueFieldInfo field = new MetadataValueFieldInfo("",
				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("Search query for assets with parsable TITLE asset: " + query);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}
