package eu.dnetlib.pace.model;

import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
import com.googlecode.protobuf.format.JsonFormat;
import eu.dnetlib.data.proto.FieldTypeProtos.Qualifier;
import eu.dnetlib.data.proto.FieldTypeProtos.StructuredProperty;
import eu.dnetlib.pace.AbstractProtoPaceTest;
import eu.dnetlib.pace.config.Config;
import eu.dnetlib.pace.model.adaptor.Pid;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class ProtoDocumentBuilderTest extends AbstractProtoPaceTest {

	@Test
	public void test_serialise1() {

		final String id = "12345";

		final Config config = getResultFullConf();

		final MapDocument document = ProtoDocumentBuilder.newInstance(id, getResult(id), config.model());

		assertFalse(document.fieldNames().isEmpty());
		assertFalse(Iterables.isEmpty(document.fields()));

		System.out.println("original:\n" + document);

		final String stringDoc = MapDocumentSerializer.toString(document);

		System.out.println("srialization:\n" + stringDoc);

		final MapDocument decoded = MapDocumentSerializer.decode(stringDoc.getBytes());

		final SetView<String> diff = Sets.difference(document.fieldNames(), decoded.fieldNames());

		assertTrue(diff.isEmpty());

		System.out.println("decoded:\n" + decoded);
	}

	@Test
	public void test_serialise2() {

		final String id = "12345";
		final String path = "/eu/dnetlib/pace/model/gt.author.manghi1.json";

		final Config config = getPersonConf();

		final MapDocument document = ProtoDocumentBuilder.newInstance(id, getPersonGT(path).getEntity(), config.model());

		assertFalse(document.fieldNames().isEmpty());
		assertFalse(Iterables.isEmpty(document.fields()));

		System.out.println("original:\n" + document);

		final String stringDoc = MapDocumentSerializer.toString(document);

		System.out.println("srialization:\n" + stringDoc);

		final MapDocument decoded = MapDocumentSerializer.decode(stringDoc.getBytes());

		final SetView<String> diff = Sets.difference(document.fieldNames(), decoded.fieldNames());

		assertTrue(diff.isEmpty());

		System.out.println("decoded:\n" + decoded);
	}


	@Test
	public void testPidSerialization() {

		final StructuredProperty sp = StructuredProperty.newBuilder().setValue("1234").setQualifier(
				Qualifier.newBuilder().setClassid("doi").setClassname("doi").setSchemeid("dnet:pid_types").setSchemename("dnet:pid_types")).build();

		final String json = JsonFormat.printToString(sp);

		final Pid pid = Pid.fromOafJson(json);




	}

}
