package eu.dnetlib.r2d2.neo4j;

import junit.framework.Assert;

import org.junit.Test;

import eu.dnetlib.r2d2.neo4j.domain.Neo4jRLEntry;
import eu.dnetlib.r2d2.neo4j.domain.Neo4jRLEntry.Kind;

public class TestRatings extends BaseTestCase {
	
	@Test
	public void test() {
		// create a few users and their mvls
		String uId1 = profileDao.newBean().getId();
		String uId2 = profileDao.newBean().getId();
		String uId3 = profileDao.newBean().getId();
		String uId4 = profileDao.newBean().getId();
		
		String rlId1 = rlDao.newBean().getId();
		String rlId2 = rlDao.newBean().getId();
		String rlId3 = rlDao.newBean().getId();
		String rlId4 = rlDao.newBean().getId();
		
		rlDao.setUserMVL(uId1, rlId1);
		rlDao.setUserMVL(uId2, rlId2);
		rlDao.setUserMVL(uId3, rlId3);
		rlDao.setUserMVL(uId4, rlId4);
		
		// create an item, add it to some mvls and rate some of the entries
		String iId1 = itemDao.newBean().getId();
		
		Neo4jRLEntry entry1 = entryDao.newBean();
		entry1.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry1.getId(), iId1);
		entryDao.addEntryToReadingList(entry1.getId(), rlId1);
		
		entry1.setRating(0.5d);
		
		Neo4jRLEntry entry2 = entryDao.newBean();
		entry2.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry2.getId(), iId1);
		entryDao.addEntryToReadingList(entry2.getId(), rlId2);
		
		entry2.setRating(0.3d);
		
		Neo4jRLEntry entry3 = entryDao.newBean();
		entry3.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry3.getId(), iId1);
		entryDao.addEntryToReadingList(entry3.getId(), rlId3);
		
		/*
		 * So far, item 1 has entries in rl 1-3 (not 4) and is rated in
		 * rl 1 and 2 (0.5 and 0.3). rating is expected to be 0.4
		 */
		Assert.assertEquals(0.4d, entryDao.getInformationObjectRating(iId1));
		
		// create an extra rl, add the item to it and rate it. The result should
		// stay the same
		
		String rlId5 = rlDao.newBean().getId();
		Neo4jRLEntry entry4 = entryDao.newBean();
		entry4.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry4.getId(), iId1);
		entryDao.addEntryToReadingList(entry4.getId(), rlId5);
		
		entry4.setRating(0.9d);
		
		Assert.assertEquals(0.4d, entryDao.getInformationObjectRating(iId1));
		
		// add this new rl to an MVL. no changes expected
		Neo4jRLEntry entry5 = entryDao.newBean();
		entry5.setKind(Kind.READING_LIST);
		entryDao.setInformationObject(entry5.getId(), rlId5);
		entryDao.addEntryToReadingList(entry5.getId(), rlId1);
		
		entry5.setRating(0.7d);
		
		Assert.assertEquals(0.4d, entryDao.getInformationObjectRating(iId1));
		
		// change a rating and retest (0.7 and 0.3 ratings now)
		entry1.setRating(0.7d);
		
		Assert.assertEquals(0.5d, entryDao.getInformationObjectRating(iId1));
		
		// commit, rechange and retest (0.5 and 0.3 ratings now)
		after();
		before();
		
		entry1.setRating(0.5);
		Assert.assertEquals(0.4d, entryDao.getInformationObjectRating(iId1));
		
		// finally, add a rating to entry3 (0.5, 0.3 and 1.0 ratings now)
		entry3.setRating(1.0);
		
		Assert.assertEquals(0.6d, entryDao.getInformationObjectRating(iId1));
		
		
		// create an item with no ratings
		String iId2 = itemDao.newBean().getId();
		Neo4jRLEntry entry6 = entryDao.newBean();
		entry1.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry6.getId(), iId2);
		entryDao.addEntryToReadingList(entry6.getId(), rlId1);
		
		Neo4jRLEntry entry7 = entryDao.newBean();
		entry2.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry7.getId(), iId2);
		entryDao.addEntryToReadingList(entry7.getId(), rlId2);
		
		Neo4jRLEntry entry8 = entryDao.newBean();
		entry3.setKind(Kind.ITEM);
		entryDao.setInformationObject(entry8.getId(), iId2);
		entryDao.addEntryToReadingList(entry8.getId(), rlId3);
		
		Assert.assertEquals(0.6d, entryDao.getInformationObjectRating(iId1));
		Assert.assertNull(entryDao.getInformationObjectRating(iId2));
	}
}
