import java.util.List;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import eu.dnetlib.api.functionality.RatingService;
import eu.dnetlib.api.functionality.RatingServiceException;
import eu.dnetlib.clients.functionality.rating.ws.RatingWebService;
import eu.dnetlib.clients.functionality.rating.ws.RatingWebServiceClient;
import eu.dnetlib.domain.functionality.Rating;

public class TestRatingService {
	private static RatingService ratingService;
	
	@BeforeClass
	public static void setup() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(RatingWebService.class);
		factory.setAddress("http://vatopedi.di.uoa.gr:8280/uoa-rating-latest/services/ratingWebService");
		RatingWebServiceClient client = new RatingWebServiceClient();
		client.setWebService((RatingWebService) factory.create());
		ratingService = client;
	}
	
	@Test
	public void testRate() throws RatingServiceException {
		Assert.assertNotNull("rating service is null", ratingService);
		ratingService.rate("userId", "documentId", 5.0f);
		ratingService.rate("userId", "documentId", 4.0f);
		ratingService.rate("userId", "foo", 3.0f);
		ratingService.rate("foo", "documentId", 2.0f);
	}
	
	@Test
	public void testSearchByUser() throws RatingServiceException {
		Assert.assertNotNull("rating service is null", ratingService);
		List<Rating> ratings = ratingService.searchRatingsByUser("userId");
		Assert.assertNotNull("rating list is null", ratings);
		Assert.assertTrue("rating list is empty", ratings.size() > 0);
		for (Rating rating : ratings)
			System.out.println("rating (user = " + rating.getUserId() + ", document = " + rating.getDocumentId() + ", score = " + rating.getScore() + ")");
	}
	
	@Test
	public void testSearchByDocument() throws RatingServiceException {
		Assert.assertNotNull("rating service is null", ratingService);
		List<Rating> ratings = ratingService.searchRatingsByDocument("documentId");
		Assert.assertNotNull("rating list is null", ratings);
		Assert.assertTrue("rating list is empty", ratings.size() > 0);
		for (Rating rating : ratings)
			System.out.println("rating (user = " + rating.getUserId() + ", document = " + rating.getDocumentId() + ", score = " + rating.getScore() + ")");
	}
	
	@Test
	public void testGetTopRatings() throws RatingServiceException {
		Assert.assertNotNull("rating service is null", ratingService);
		List<Rating> ratings = ratingService.getTopRatings(10);
		Assert.assertNotNull("rating list is null", ratings);
		Assert.assertTrue("rating list is empty", ratings.size() > 0);
		for (Rating rating : ratings)
			System.out.println("rating (user = " + rating.getUserId() + ", document = " + rating.getDocumentId() + ", score = " + rating.getScore() + ")");
	}
	
	@Test
	public void testGetTopDocuments() throws RatingServiceException {
		Assert.assertNotNull("rating service is null", ratingService);
		List<Rating> ratings = ratingService.getTopDocuments(10);
		Assert.assertNotNull("rating list is null", ratings);
		Assert.assertTrue("rating list is empty", ratings.size() > 0);
		for (Rating rating : ratings)
			System.out.println("rating (user = " + rating.getUserId() + ", document = " + rating.getDocumentId() + ", score = " + rating.getScore() + ")");
	}
}
