package eu.dnetlib.r2d2.neo4j;

import javax.annotation.Resource;

import org.apache.log4j.BasicConfigurator;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.google.common.collect.Iterables;

import eu.dnetlib.r2d2.neo4j.dao.ItemDao;
import eu.dnetlib.r2d2.neo4j.dao.RLEntryDao;
import eu.dnetlib.r2d2.neo4j.dao.ReadingListDao;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jItem;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jRLEntry;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jReadingList;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jRLEntry.Kind;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/eu/dnetlib/r2d2/neo4j/applicationContext-neo4j.xml", "/eu/dnetlib/r2d2/neo4j/applicationContext-r2d2-neo4j-test.xml"})
public class TestEntries {
	
	@Resource
	private ReadingListDao rlDao = null;

	@Resource
	private RLEntryDao entryDao = null;
	
	@Resource
	private ItemDao itemDao = null;
	
	@BeforeClass
	public static void setup() {
		BasicConfigurator.configure();
	}
	
	@Test
	public void test() {
		Neo4jReadingList rl = rlDao.newBean();
		
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		
		String rlId = rlDao.saveBean(rl);
		
		rl = rlDao.newBean();
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		rlDao.saveBean(rl);
		Neo4jRLEntry entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
		entryDao.saveBean(entry);
		rlDao.setReadingListOfEntry(rl.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		
		rl = rlDao.newBean();
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		rlDao.saveBean(rl);
		entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
		entryDao.saveBean(entry);
		rlDao.setReadingListOfEntry(rl.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		rl = rlDao.newBean();
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		rlDao.saveBean(rl);
		entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
		entryDao.saveBean(entry);
		rlDao.setReadingListOfEntry(rl.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		// test the Neo4jRLEntryDao.getEntry(rlId, IOId) for rls
		Neo4jRLEntry e = entryDao.getEntry(rlId, rl.getId());
		Assert.assertNotNull(entry);
		Assert.assertEquals(entry.getId(), e.getId());
		
		Neo4jItem item = itemDao.newBean();
		itemDao.saveBean(item);
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
		entryDao.saveBean(entry);
		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean();
		itemDao.saveBean(item);
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
		entryDao.saveBean(entry);
		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean();
		itemDao.saveBean(item);
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
		entryDao.saveBean(entry);
		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean();
		itemDao.saveBean(item);
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
		entryDao.saveBean(entry);
		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		// test the Neo4jRLEntryDao.getEntry(rlId, IOId) for items
		e = entryDao.getEntry(rlId, item.getId());
		Assert.assertNotNull(entry);
		Assert.assertEquals(entry.getId(), e.getId());
		
		Assert.assertEquals(4, Iterables.size(entryDao.getReadingListEntries(rlId, Kind.ITEM)));
		Assert.assertEquals(3, Iterables.size(entryDao.getReadingListEntries(rlId, Kind.READING_LIST)));
	}
}