package eu.dnetlib.data.mapreduce.dedup;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.UUID;

import eu.dnetlib.data.mapreduce.hbase.dedup.kv.DNGFKey;
import eu.dnetlib.data.mapreduce.hbase.dli.kv.DliKey;
import org.apache.commons.io.IOUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import eu.dnetlib.pace.clustering.NGramUtils;
import eu.dnetlib.pace.config.Type;
import eu.dnetlib.pace.model.Field;
import eu.dnetlib.pace.model.FieldListImpl;
import eu.dnetlib.pace.model.FieldValueImpl;
import eu.dnetlib.pace.model.MapDocument;
import eu.dnetlib.pace.model.MapDocumentComparator;

public class TitleOrderingTest {

	private List<MapDocument> results = Lists.newArrayList();

	@Before
	public void setUp() throws Exception {

		final List<String> lines = IOUtils.readLines(new ClassPathResource("eu/dnetlib/data/mapreduce/dedup/titles.txt").getInputStream());
		for (final String title : lines) {
			final Map<String, Field> fieldMap = Maps.newHashMap();
			final FieldListImpl list = new FieldListImpl();
			list.add(new FieldValueImpl(Type.String, "title", title));
			fieldMap.put("title", list);
			results.add(new MapDocument("id-" + UUID.randomUUID(), fieldMap));
		}
	}

	@Test
	public void test() {

		final Queue<MapDocument> queue = new PriorityQueue<MapDocument>(100, new MapDocumentComparator("title"));

		queue.addAll(results);

		final Queue<MapDocument> queue2 = simplifyQueue(queue);

		while (!queue2.isEmpty()) {
			final MapDocument doc = queue2.remove();
			System.out.println(doc.values("title").stringValue());
		}
	}

	private Queue<MapDocument> simplifyQueue(final Queue<MapDocument> queue) {
		final Queue<MapDocument> q = new LinkedList<MapDocument>();

		String fieldRef = "";
		final List<MapDocument> tempResults = Lists.newArrayList();

		while (!queue.isEmpty()) {
			final MapDocument result = queue.remove();

			if (!result.values("title").isEmpty()) {
				final String field = NGramUtils.cleanupForOrdering(result.values("title").stringValue());
				if (field.equals(fieldRef)) {
					tempResults.add(result);
				} else {
					if (tempResults.size() < 5) {
						q.addAll(tempResults);
					} else {
						System.out.println("Skipped field: " + fieldRef + " - size: " + tempResults.size());
					}
					tempResults.clear();
					tempResults.add(result);
					fieldRef = field;
				}
			}
		}
		if (tempResults.size() < 5) {
			q.addAll(tempResults);
		} else {
			System.out.println("Skipped field: " + fieldRef + " - size: " + tempResults.size());
		}

		return q;
	}


    @Test
    public void compareDLIKey() {

        DNGFKey k1 = DNGFKey.mergesRel("a");
        DNGFKey k2 = DNGFKey.otherRel("a");

        Assert.assertEquals(-1, k1.compareTo(k2));
        Assert.assertEquals(0, k1.compareTo(k1));
        Assert.assertEquals(1, k2.compareTo(k1));


    }

}
