package eu.dnetlib.r2d2.neo4j;

import org.junit.Assert;
import org.junit.Test;

import com.google.common.collect.Iterables;

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;

public class TestEntries extends BaseTestCase {
	String rlId = "main rl";
	
	@Test
	public void test() {
		// add a couple of extra irrelevant items
		itemDao.newBean("Irrelevant user 1").setItemUrl("url1");
		itemDao.newBean("Irrelevant user 2").setItemUrl("url2");
		
		// and a few irrelevant rls as well
		rlDao.newBean("Irrelevant rl 1").setName("I don't care");
		rlDao.newBean("Irrelevant rl 2").setName("I don't care2");
		rlDao.newBean("Irrelevant rl 3").setName("I don't care3");
		
		Neo4jReadingList rl = rlDao.newBean(rlId);
		
		rl.setAvatarUrl("Avatar url");
		rl.setDescription("a coool description");
		rl.setName("Parent reading list");
		
		assertNotNull(rlId);
		
		rl = rlDao.newBean("rl1");
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		Neo4jRLEntry entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
// 		using the new method instead
//		rlDao.setReadingListForEntry(rl.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), rl.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		
		rl = rlDao.newBean("rl2");
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
// 		using the new method instead
//		rlDao.setReadingListForEntry(rl.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), rl.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		rl = rlDao.newBean("rl3");
		rl.setAvatarUrl("dsf");
		rl.setDescription("fdsf");
		rl.setName("sff");
		entry = entryDao.newBean();
		entry.setKind(Kind.READING_LIST);
// 		using the new method instead
//		rlDao.setReadingListForEntry(rl.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), rl.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		// test the Neo4jRLEntryDao.getEntry(rlId, IOId) for rls
		Neo4jRLEntry e = entryDao.getEntry(rlId, rl.getId());
		Assert.assertNotNull(e);
		Assert.assertEquals(entry.getId(), e.getId());
		
		Neo4jItem item = itemDao.newBean("item1");
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
// 		using the new method instead
//		rlDao.setReadingListForEntry(rl.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), item.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean("item2");
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
// 		using the new method instead
//		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), item.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean("item3");
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
// 		using the new method instead
//		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), item.getId());
		entryDao.addEntryToReadingList(entry.getId(), rlId);
		
		item = itemDao.newBean("item4");
		entry = entryDao.newBean();
		entry.setKind(Kind.ITEM);
// 		using the new method instead
//		itemDao.setItemForEntry(item.getId(), entry.getId());
		entryDao.setInformationObject(entry.getId(), item.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)));
		Assert.assertEquals(4,  Iterables.size(itemDao.getItemsInReadingList(rlId)));
		Assert.assertEquals(3,  Iterables.size(rlDao.getContainedReadingLists(rlId)));
	}
	
	@Test
	public void assertAgain() throws InterruptedException {
		Iterable<Neo4jReadingList> it = rlDao.search("Parent reading list", Neo4jReadingList.NAME);
		
		Assert.assertTrue(Iterables.size(it) > 0);
		
		it = rlDao.search("Parent reading list", Neo4jReadingList.NAME);
		
		rlId = Iterables.get(it, 0).getId();
		
		Assert.assertNotNull(rlId);
		
		Assert.assertEquals(4, Iterables.size(entryDao.getReadingListEntries(rlId, Kind.ITEM)));
		Assert.assertEquals(3, Iterables.size(entryDao.getReadingListEntries(rlId, Kind.READING_LIST)));
		Assert.assertEquals(4,  Iterables.size(itemDao.getItemsInReadingList(rlId)));
		Assert.assertEquals(3,  Iterables.size(rlDao.getContainedReadingLists(rlId)));
	}
}