package com.hypsoma.hermes.business.itest;

import static org.junit.Assert.assertTrue;

import java.io.File;
import java.util.Iterator;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.EJBContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.persistence.CleanupUsingScript;
import org.jboss.arquillian.persistence.ShouldMatchDataSet;
import org.jboss.arquillian.persistence.TestExecutionPhase;
import org.jboss.arquillian.persistence.UsingDataSet;
import org.jboss.shrinkwrap.api.GenericArchive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.resolver.api.DependencyResolvers;
import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.hypsoma.hermes.business.biz.IShopManagerLocal;
import com.hypsoma.hermes.business.biz.impl.InputValidator;
import com.hypsoma.hermes.business.dao.IAddressDaoLocal;
import com.hypsoma.hermes.business.dao.ICustomerDaoLocal;
import com.hypsoma.hermes.business.dao.IShopOwnerDaoLocal;
import com.hypsoma.hermes.business.ext.Emailer;
import com.hypsoma.hermes.business.transaction.IPaymentPlatformHandler;
import com.hypsoma.hermes.business.ui.CatalogNodeUiServiceLocal;
import com.hypsoma.hermes.business.ui.ReferenceUiServiceLocal;
import com.hypsoma.hermes.business.webservice.impl.Dtoizer;
import com.hypsoma.hermes.domain.ShopOwner;
import com.hypsoma.hermes.shared.ReferenceDto;
import com.hypsoma.hermes.shared.UiInternalErrorException;
import com.sun.appserv.security.ProgrammaticLogin;

@RunWith(Arquillian.class)
public class ITCatalogNodeUiService {

	@Deployment
	public static EnterpriseArchive createDeployment() {

		JavaArchive biz = ShrinkWrap.create(JavaArchive.class,
				"business-1.2.1.jar");
		biz.addPackages(true, ICustomerDaoLocal.class.getPackage());
		biz.addPackages(true, IAddressDaoLocal.class.getPackage());
		biz.addPackages(true, Emailer.class.getPackage());
		biz.addPackages(true, IPaymentPlatformHandler.class.getPackage());
		biz.addPackages(true, CatalogNodeUiServiceLocal.class.getPackage());
		biz.addPackages(true, InputValidator.class.getPackage());
		biz.addPackages(true, IShopManagerLocal.class.getPackage());
		biz.addPackages(true, Dtoizer.class.getPackage());
		biz.addPackages(true, UiInternalErrorException.class.getPackage());
		//biz.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");

		// System.out.println(biz.toString(true));
		/*
		GenericArchive opencsv = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("net.sf.opencsv:opencsv:2.3")
				.resolveAs(GenericArchive.class).iterator().next();

		GenericArchive standards = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("com.hypsoma.hyagora:standards:1.1.0")
				.resolveAs(GenericArchive.class).iterator().next();

		GenericArchive httpclient = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("org.apache.httpcomponents:httpclient:4.2.1")
				.resolveAs(GenericArchive.class).iterator().next();

		GenericArchive httpcore = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("org.apache.httpcomponents:httpcore:4.2.1")
				.resolveAs(GenericArchive.class).iterator().next();
*/
		Iterator<GenericArchive> domainIt = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("com.hypsoma.hermes:domain:1.2.1")
				.resolveAs(GenericArchive.class).iterator();

		Iterator<GenericArchive> templateIt = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("com.hypsoma.hermes:template:1.2.1")
				.resolveAs(GenericArchive.class).iterator();
		
		Iterator<GenericArchive> httpclientIt = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("org.apache.httpcomponents:httpclient:4.2.1")
				.resolveAs(GenericArchive.class).iterator();
		
		Iterator<GenericArchive> opencsvIt = DependencyResolvers
				.use(MavenDependencyResolver.class)
				.artifact("net.sf.opencsv:opencsv:2.3")
				.resolveAs(GenericArchive.class).iterator();
		
		EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class,
				"hermes.ear");
		ear.addAsModule(biz);
		
		while(domainIt.hasNext()){
			GenericArchive dep = domainIt.next();
			ear.addAsLibrary(dep);
		}
		
		while(templateIt.hasNext()){
			GenericArchive dep = templateIt.next();
			ear.addAsLibrary(dep);
		}
		
		while(httpclientIt.hasNext()){
			GenericArchive dep = httpclientIt.next();
			ear.addAsLibrary(dep);
		}
		
		while(opencsvIt.hasNext()){
			GenericArchive dep = opencsvIt.next();
			ear.addAsLibrary(dep);
		}

		//ear.addAsLibrary(new File("../domain/target/domain-1.2.1.jar"));
		//ear.addAsLibrary(new File("../template/target/template-1.2.1.jar"));
		//ear.addAsLibrary(new File("../ui-dto/target/ui-dto-1.2.1.jar"));
		//ear.addAsLibrary(opencsv);
		//ear.addAsLibrary(standards);
		//ear.addAsLibrary(httpclient);
		//ear.addAsLibrary(httpcore);

		ear.getAsType(JavaArchive.class, "/business-1.2.1.jar").addClass(
				"com.hypsoma.hermes.business.itest.ITCatalogNodeUiService");

		System.out.println(ear.toString(true));
		return ear;
	}

	@EJB(mappedName="java:global/hermes/business-1.2.1/ReferenceUiService!com.hypsoma.hermes.business.ui.ReferenceUiServiceLocal")
	private ReferenceUiServiceLocal service;

	@EJB
	private IShopOwnerDaoLocal ownerDao;

	@Resource
	private EJBContext ctx;

	@PersistenceContext
	private EntityManager em;

	/*
	 * @Test
	 * 
	 * @UsingDataSet("datasets/users.yml")
	 * 
	 * @ShouldMatchDataSet("datasets/expected-users.yml") public void
	 * testNodeCreationWithAttributes() throws Exception { final
	 * ProgrammaticLogin login = new ProgrammaticLogin(); boolean loginSucceeded
	 * = login.login("test", "test".toCharArray(), "fileRealm", true); if
	 * (loginSucceeded) { ShopOwner owner = getShopOwner();
	 * 
	 * CatalogNodeDto dto = new CatalogNodeDto(); dto.setName("dto");
	 * dto.setBusinessReference(null); dto.setType(type1);
	 * 
	 * AttributeDto attr1dto = new AttributeDto();
	 * attr1dto.setId(attr1.getId()); attr1dto.setName("attr1");
	 * 
	 * AttributeDto attr2dto = new AttributeDto();
	 * attr2dto.setId(attr2.getId()); attr2dto.setName("attr2");
	 * 
	 * HashMap<AttributeDto, String> attrValues = new HashMap<AttributeDto,
	 * String>(); attrValues.put(attr1dto, "value1"); attrValues.put(attr2dto,
	 * "value2");
	 * 
	 * // dto.getAttributes().
	 * 
	 * } else { throw new Exception("failed login"); } }
	 */

	@Test
	//@CleanupUsingScript(phase=TestExecutionPhase.BEFORE, value="scripts/cleanup-com.hypsoma.hermes.business.biz.impl.ITCatalogNodeUiService.sql")
	@UsingDataSet("datasets/baseset.xml")
	@ShouldMatchDataSet("datasets/expected-ref-creation.xml")
	public void testNodeCreationWithAttributes() throws Exception {
		final ProgrammaticLogin login = new ProgrammaticLogin();
		boolean loginSucceeded = login.login("test", "test".toCharArray(),
				"fileRealm", true);
		if (loginSucceeded) {
			ReferenceDto dto = new ReferenceDto();
			dto.setBillDescription("billdesc");
			dto.setBusinessReference("bizref1");
			service.createReference(dto);
			assertTrue(true);
		}
	}

	private ShopOwner getShopOwner() throws Exception {
		String emailAddress = ctx.getCallerPrincipal().getName();
		ShopOwner owner = ownerDao.findByEmailAddress(emailAddress);
		return owner;
	}

}
