package com.tandbergtv.metadata.test.search;

import static org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRED;

import java.util.Collection;
import java.util.List;

import junit.framework.TestCase;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import com.tandbergtv.metadatamanager.model.Asset;
import com.tandbergtv.metadatamanager.search.AssetSearchService;

public class AssetSearchServiceImplTest extends TestCase {

	private ApplicationContext context;

	@Override
	public void setUp() throws Exception {
		super.setUp();

		try {
			this.context = new ClassPathXmlApplicationContext(new String[] {
					"MetadataBeansContext.xml",
					"MetadataManagerDBContext.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 testSearchAssets() {
		String query = "select a.ID as assetId from MDM_ASSET a,MDM_FIELD f where a.STATE = 1 AND a.type in ('PACKAGE') AND f.ttvXPath='/tns:Fields/tns:AssetName' AND f.value = 'Demo3' AND a.ID = f.ASSET_ID";
		AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
		try {
			PlatformTransactionManager txmgr = 
				(PlatformTransactionManager) context.getBean("transactionManager");
			TransactionStatus status = 
				txmgr.getTransaction(new DefaultTransactionDefinition(PROPAGATION_REQUIRED));

			Collection<Asset> assets = service.search(query);
			System.out.println("Got " + assets.size() + " asset(s)");
			for (Asset a : assets) {
				System.out.println(a.toString());
			}
			
			txmgr.commit(status);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testCount() {
		// String query = "select a.ID as assetId from MDM_ASSET a,MDM_FIELD f where a.STATE = 1 AND a.type in ('PACKAGE') AND f.ttvXPath='/tns:Fields/tns:AssetName' AND f.value = 'Demo3' AND a.ID = f.ASSET_ID";
		String query = "select asset.ID as assetId from MDM_ASSET asset where asset.STATE=1 AND asset.type in ('PACKAGE') AND asset.ID not in (select a.ID as assetId from MDM_ASSET a,MDM_FIELD f where a.STATE = 1 AND a.type in ('PACKAGE') AND f.ttvXPath='/tns:Fields/tns:AssetName' AND f.value like '%Demo%' AND a.ID = f.ASSET_ID)";
		AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
		try {
			PlatformTransactionManager txmgr = 
				(PlatformTransactionManager) context.getBean("transactionManager");
			TransactionStatus status = 
				txmgr.getTransaction(new DefaultTransactionDefinition(PROPAGATION_REQUIRED));

			int count = service.count(query);
			System.out.println("Got " + count + " asset(s)");
			
			txmgr.commit(status);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void testSearchAssetIds() {
		String query = "select asset.ID as assetId from MDM_ASSET asset where asset.STATE=1 AND asset.type in ('PACKAGE') AND asset.ID not in (select a.ID as assetId from MDM_ASSET a,MDM_FIELD f where a.STATE = 1 AND a.type in ('PACKAGE') AND f.ttvXPath='/tns:Fields/tns:AssetName' AND f.value like '%Demo%' AND a.ID = f.ASSET_ID)";
		AssetSearchService service = (AssetSearchService) context.getBean("assetSearch");
		try {
			PlatformTransactionManager txmgr = 
				(PlatformTransactionManager) context.getBean("transactionManager");
			TransactionStatus status = 
				txmgr.getTransaction(new DefaultTransactionDefinition(PROPAGATION_REQUIRED));

			List<Long> assetIds = (List<Long>) service.searchForAssetId(query);
			System.out.println("Total number of matching assetIDs: " + assetIds.size());
			for(long id : assetIds) {
				System.out.println(id);
			}
			txmgr.commit(status);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}
