package eu.dnetlib.cql.mongo;

import java.io.IOException;

import com.google.common.collect.Lists;
import com.mongodb.BasicDBObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import org.junit.Ignore;
import org.junit.Test;
import org.z3950.zing.cql.CQLParseException;

import static org.junit.Assert.assertEquals;

/**
 * Created by alessia on 18/01/17.
 */
public class MongoCqlTranslatorTest {
	private static final Log log = LogFactory.getLog(MongoCqlTranslatorTest.class); // NOPMD by marko on 11/24/08 5:02 PM
	private final MongoCqlTranslator tr = new MongoCqlTranslator();

	@Test
	public void testParseEq() throws IOException, CQLParseException {
		Bson expected = new BasicDBObject("set", "CEDIASManuscripts");
		Bson o = tr.toMongo("set = \"CEDIASManuscripts\"");
		assertEquals(expected, o);

	}

	@Test
	public void testParseNeq() throws IOException, CQLParseException {
		Bson expected = new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts"));
		Bson o = tr.toMongo("set <> \"CEDIASManuscripts\"");
		assertEquals(expected, o);
	}

	@Test
	public void testParseAnd() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts")),
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
		Bson o = tr.toMongo("set <> \"CEDIASManuscripts\" AND pippo > x");
		log.info(o);
		assertEquals(expected, o);
	}

	@Test
	public void testParseOr() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("$or", Lists.newArrayList(new BasicDBObject("set", new BasicDBObject("$ne", "CEDIASManuscripts")),
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
		Bson o = tr.toMongo("set <> \"CEDIASManuscripts\" OR pippo > x");
		log.info(o);
		assertEquals(expected, o);
	}

	@Test
	public void testParseNot() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject("set", "CEDIASManuscripts"), new BasicDBObject("$not",
				new BasicDBObject("pippo", new BasicDBObject("$gt", "x")))));
		Bson o = tr.toMongo("set = \"CEDIASManuscripts\" NOT pippo > x");
		//log.info(o)
		assertEquals(expected, o);
	}

	@Test
	public void testParseStar() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject();
		Bson o = tr.toMongo("*");
		Bson o2 = tr.toMongo("*=*");
		assertEquals(expected, o);
		assertEquals(expected, o2);
	}

	@Test
	public void testParseStarAnd() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("$and", Lists.newArrayList(new BasicDBObject(), new BasicDBObject("pippo", new BasicDBObject("$gt", "x"))));
		Bson o = tr.toMongo("* AND pippo > x");
		Bson o2 = tr.toMongo("*=* AND pippo > x");
		assertEquals(expected, o);
		assertEquals(expected, o2);
	}

	@Test
	public void testParseIdQuery() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("_id", new BasicDBObject("$gt", new ObjectId("5225e093aabf055637bf2c65")));
		Bson o = tr.toMongo("_id > 5225e093aabf055637bf2c65");
		assertEquals(expected, o);
	}

	@Ignore
	@Test
	public void testParseWfLoggerQuery() throws IOException, CQLParseException {
		BasicDBObject expected = new BasicDBObject("$and",
				Lists.newArrayList(
						new BasicDBObject("parentDatasourceId", "opendoar____::2294"),
						new BasicDBObject("system:profileFamily", "aggregator"),
						new BasicDBObject("system:isCompletedSuccessfully", "true")));

		Bson o = tr.toMongo("{\"parentDatasourceId\" : \"opendoar____::2294\", \"system:profileFamily\" : \"aggregator\", \"system:isCompletedSuccessfully\" : \"true\" }");
		assertEquals(expected, o);
	}
}
