package eu.dnetlib.lbs.events.output;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.mail.Message;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import eu.dnetlib.lbs.elasticsearch.Event;
import eu.dnetlib.lbs.properties.EmailProperties;
import eu.dnetlib.lbs.subscriptions.NotificationFrequency;
import eu.dnetlib.lbs.subscriptions.NotificationMode;
import eu.dnetlib.lbs.subscriptions.Subscription;

public class EmailDispatcherTest {

	private static final String TOPIC = "ENRICH/MISSING/PID";

	private EmailDispatcher disparcher = new EmailDispatcher();

	private Resource emailTemplate = new ClassPathResource("templates/openaire_mail.st");
	private final EmailProperties props = new EmailProperties();

	@Before
	public void setUp() throws Exception {
		props.setFrom("lbs@mail.it");
		props.setFromName("LBS");
		props.setCc("other@mail.it");
		props.setSmtpHost("smtp.server.com");
		props.setSmtpPort(587);
		props.setSmtpUser("lbs");
		props.setSmtpPassword("password");

		disparcher.setEmailTemplate(emailTemplate);
		disparcher.setProps(props);
	}

	@Test
	@Ignore
	public void testPrepareAction() throws Exception {
		final Subscription sub = new Subscription();
		sub.setSubscriptionId("sub-123");
		sub.setSubscriber("user@mail.it");
		sub.setTopic(TOPIC);
		sub.setFrequency(NotificationFrequency.daily);
		sub.setMode(NotificationMode.EMAIL);
		sub.setLastNotificationDate(null);
		sub.setCreationDate(new Date());
		sub.setConditions(
				"[{\"field\":\"target_datasource_name\",\"fieldType\":\"STRING\",\"operator\":\"EXACT\",\"listParams\":[{\"value\":\"DUGiDocs – Universitat de Girona\"}]},{\"field\":\"trust\",\"fieldType\":\"FLOAT\",\"operator\":\"RANGE\",\"listParams\":[{\"value\":\"0\",\"otherValue\":\"1\"}]}]");

		final Event event1 = generateRandomEvent();
		final Event event2 = generateRandomEvent();
		final Event event3 = generateRandomEvent();

		final Message message = disparcher.prepareAction(sub, event1, event2, event3);

		System.out.println(message.getContent());
	}

	private Event generateRandomEvent() {
		final long now = new Date().getTime();
		final Map<String, Object> map = new HashMap<>();
		map.put("target_publication_author_list", Arrays.asList("LIMA, J. de F.",
				"SILVA, L. M. A. da",
				"SILVA, T. C. da",
				"GARCIA, J. da S.",
				"PEREIRA, I. da S.",
				"AMARAL, K. D. S."));
		map.put("target_publication_title",
				"Reproductive aspects of Macrobrachium amazonicum (Decapoda: Palaemonidae) in the State of Amapá, Amazon River mouth.");

		final String payload = "";

		final Event e =
				new Event();
		e.setCreationDate(now);
		e.setEventId("event-" + UUID.randomUUID());
		e.setExpiryDate(now + 2592000000l);
		e.setInstantMessage(false);
		e.setMap(map);
		e.setPayload(payload);
		e.setProducerId("OpenAIRE");
		e.setTopic(TOPIC);
		return e;
	}

}
