package org.eclipse.openk.sp.controller;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.ws.rs.core.Response;

import org.eclipse.openk.sp.abstracts.AbstractDto;
import org.eclipse.openk.sp.abstracts.AbstractEntity;
import org.eclipse.openk.sp.controller.reports.ReportController;
import org.eclipse.openk.sp.db.converter.EntityConverter;
import org.eclipse.openk.sp.db.dao.CyclicReportGenerationConfigRepository;
import org.eclipse.openk.sp.db.model.ReportGenerationConfig;
import org.eclipse.openk.sp.dto.ReportGenerationConfigDto;
import org.eclipse.openk.sp.dto.report.ReportDto;
import org.eclipse.openk.sp.exceptions.SpException;
import org.eclipse.openk.sp.util.ArchiveHelper;
import org.eclipse.openk.sp.util.MailHelper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.util.ReflectionTestUtils;

@RunWith(MockitoJUnitRunner.class)
public class CyclicReportsControllerTest {
	


	@InjectMocks
	private CyclicReportsController automaticReportsController;


	@Mock
	private CyclicReportGenerationConfigRepository automaticReportGenerationConfigRepository;

	@Mock
	private MailHelper mailHelper;

	@Mock
	private ArchiveHelper archiveHelper;

	@Mock
	private EntityConverter entityConverter;

	@Mock
	private ReportController reportController;
	
	@Before
	public void init() {
		ReflectionTestUtils.setField(automaticReportsController, "datePattern", "yyyy-MM-dd"); 
		ReflectionTestUtils.setField(automaticReportsController, "timePattern", "HH-mm"); 
		ReflectionTestUtils.setField(automaticReportsController, "weekPattern", "'KW'ww"); 
		ReflectionTestUtils.setField(automaticReportsController, "archivePath", "/opt/openk/reports"); 
		ReflectionTestUtils.setField(automaticReportsController, "slotDeltaMin", 5); 
		ReflectionTestUtils.setField(automaticReportsController, "zoneName", "Europe/Berlin"); 
		ReflectionTestUtils.setField(automaticReportsController, "locale", "de"); 
		ReflectionTestUtils.setField(automaticReportsController, "sendReportMail", true); 
		ReflectionTestUtils.setField(automaticReportsController, "archiveReport", true); 
		ReflectionTestUtils.invokeMethod(automaticReportsController, "init");
	}
	
	@Test
	public void constructorTest() {
		CyclicReportsController controller = new CyclicReportsController();
		assertNotNull(controller);
	}

	@Test
	public void getAllReportGenerationConfigTest() throws SpException {
		List<ReportGenerationConfig> configs = new ArrayList<>();
		ReportGenerationConfig config = new ReportGenerationConfig();
		
		configs.add(config);
		Mockito.when(automaticReportGenerationConfigRepository.findAll()).thenReturn(configs);
		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
		Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
				.thenReturn((AbstractDto) reportGenerationConfigDto);
		
		List<ReportGenerationConfigDto> configDtos = automaticReportsController.getAllReportGenerationConfig();
		assertNotNull(configDtos);
		
		assertTrue(configDtos.size() == 1);
		ReportGenerationConfigDto configDto = configDtos.get(0);
		assertTrue(configDto == reportGenerationConfigDto);

	}

	@Test
	public void deleteReportGenerationConfigTest() throws SpException {
		Long configId = 23L;
		ReportGenerationConfig config = new ReportGenerationConfig();
		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
		Response response = automaticReportsController.deleteReportGenerationConfig(configId);
		assertEquals(204, response.getStatus());
		Mockito.verify(automaticReportGenerationConfigRepository).delete(Mockito.eq(configId));
	}

	@Test
	public void deleteReportGenerationConfigTestNotFound() {
		Long configId = 23L;
		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
		try {
			automaticReportsController.deleteReportGenerationConfig(configId);
			fail("Should have thrown SpException");
		} catch  (SpException e) {
			// pass
		}
	}
	
	@Test
	public void editReportGenerationConfigTest() throws SpException {
		Long configId = 23L;
		ReportGenerationConfig config = new ReportGenerationConfig();
		config.setId(configId);
		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
		Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
		ReportGenerationConfigDto response = automaticReportsController.editReportGenerationConfig(configId, reportGenerationConfigDto);
		assertEquals(configId, response.getId());
		Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
	}
	
	@Test
	public void editReportGenerationConfigTestNotFound() throws SpException {
		Long configId = 23L;
		ReportGenerationConfigDto config = new ReportGenerationConfigDto();
		Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
		try {
			automaticReportsController.editReportGenerationConfig(configId, config);
			fail("Should have thrown SpException");
		} catch  (SpException e) {
			// pass
		}
	}

	@Test
	public void addReportGenerationConfigTest() throws SpException {
		Long configId = 23L;
		ReportGenerationConfig config = new ReportGenerationConfig();
		config.setId(configId);
		ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
		Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
		Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
				.thenReturn((AbstractDto) reportGenerationConfigDto);
		ReportGenerationConfigDto response = automaticReportsController.addReportGenerationConfig(reportGenerationConfigDto);
		assertEquals(reportGenerationConfigDto, response);
		Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
	}
	

	@Test
	public void generateReportTest() throws SpException {
		ReportGenerationConfig reportCfg = new ReportGenerationConfig();
		String reportName = "REPORT_NAME";
		reportCfg.setReportName(reportName);
		String printFormat = "print_format";
		reportCfg.setPrintFormat(printFormat );
		Long statusId = 23L;
		reportCfg.setStatusId(statusId);
		Integer validDayFromOffset = -3;
		reportCfg.setValidFromDayOffset(validDayFromOffset);
		Integer validDayFromHour = 2;
		reportCfg.setValidFromHour(validDayFromHour);
		Integer validDayFromMinute =  5;
		reportCfg.setValidFromMinute(validDayFromMinute);

		Integer validDayToOffset = 3;
		reportCfg.setValidToDayOffset(validDayToOffset);
		Integer validDayToHour = 3;
		reportCfg.setValidToHour(validDayToHour);
		Integer validDayToMinute =  10;
		reportCfg.setValidToMinute(validDayToMinute);
		LocalDateTime triggerDate = LocalDateTime.of(2020, 1, 10, 3, 50);

		Date fromDate = Date.from(LocalDateTime.of(2020, 1, 7, 2, 5).atZone(ZoneId.of("UTC")).toInstant());
		Date toDate = Date.from(LocalDateTime.of(2020, 1, 13, 3, 10).atZone(ZoneId.of("UTC")).toInstant());
	
		File file = Mockito.mock(File.class);
		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
		File resp = automaticReportsController.generateReport(reportCfg, triggerDate);
		assertTrue(file ==  resp);
		ArgumentCaptor<ReportDto> reportDtoCaptor = ArgumentCaptor.forClass(ReportDto.class);

		Mockito.verify(reportController).generateReport(reportDtoCaptor.capture());
		ReportDto reportDto = reportDtoCaptor.getValue();
		assertEquals(reportName, reportDto.getReportName());
		assertEquals(printFormat, reportDto.getPrintFormat());
		assertEquals(statusId, reportDto.getStatusId());
		assertEquals(fromDate, reportDto.getValidFromDate());
		assertEquals(toDate, reportDto.getValidToDate());
	}

	@Test
	public void getReportGenerationConfigsTest() {
		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);

		automaticReportsController.getReportGenerationConfigs(triggerTimeGreaterEqual, triggerTimeLowerEqual);
		Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(3, 1, 5, 9);
	}

	@Test
	public void generateAndDistributeReportsTest() throws SpException, MessagingException, IOException {
		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);

		List<ReportGenerationConfig> configs = new ArrayList<>();
		ReportGenerationConfig config = sampleReportGenerationConfig();
		configs.add(config);
		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
	
		File file = Mockito.mock(File.class);
		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);

		MimeMessage msg = Mockito.mock(MimeMessage.class);
		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
		
		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
		
		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
		
		Mockito.verify(reportController).generateReport(Mockito.any(ReportDto.class));
		Mockito.verify(mailHelper).send(Mockito.any(MimeMessage.class));
		Mockito.verify(archiveHelper).copyFile(Mockito.any(String.class), Mockito.eq("/opt/openk/reports/" + config.getFileNamePattern() + "." + config.getPrintFormat()));
		
	}
	
	@Test
	public void generateAndDistributeReportsTestIOException() throws SpException, MessagingException, IOException {
		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);

		List<ReportGenerationConfig> configs = new ArrayList<>();
		ReportGenerationConfig config = sampleReportGenerationConfig();
		configs.add(config);
		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
	
		File file = Mockito.mock(File.class);
		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
		
		Mockito.doThrow(new IOException()).when(archiveHelper).copyFile(Mockito.any(), Mockito.any());
		
		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
	
	}
	
	@Test
	public void generateAndDistributeReportsTestSpException() throws SpException, MessagingException, IOException {
		LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
		LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);

		List<ReportGenerationConfig> configs = new ArrayList<>();
		ReportGenerationConfig config = sampleReportGenerationConfig();
		configs.add(config);
		Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
	
		File file = Mockito.mock(File.class);
		Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
		
		Mockito.doThrow(new SpException()).when(reportController).generateReport(Mockito.any());
		
		automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
	
	}



	@Test
	public void sendReportTest() throws MessagingException, IOException {

		File reportFile = Mockito.mock(File.class);
		String fileName = "fileName";
		ReportGenerationConfig cfg = new ReportGenerationConfig();
		String subject = "subject";
		cfg.setSubject(subject);
		String emailText = "mailText";
		cfg.setEmailText(emailText);
		List<String> toList = new ArrayList<>();
		String email = "mail@test.tld";
		toList.add(email);
		cfg.setTo(toList);

		ArgumentCaptor<MimeMessage> msgCaptor = ArgumentCaptor.forClass(MimeMessage.class);

		MimeMessage msg = Mockito.mock(MimeMessage.class);
		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
		LocalDateTime triggerTime = LocalDateTime.now();
		automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
		Mockito.verify(mailHelper).send(msgCaptor.capture());
		MimeMessage sendMail = msgCaptor.getValue();
		assertTrue(sendMail == msg);
	
	}
	
	@Test
	public void sendReportTestMessagingException() throws MessagingException, IOException {
	
		File reportFile = Mockito.mock(File.class);
		String fileName = "fileName";
		ReportGenerationConfig cfg = new ReportGenerationConfig();
		String subject = "subject";
		cfg.setSubject(subject);
		List<String> toList = new ArrayList<>();
		String email = "mail@test.tld";
		toList.add(email);
		cfg.setTo(toList);

		MimeMessage msg = Mockito.mock(MimeMessage.class);
		Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
		Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
		Mockito.doThrow(new MessagingException()).when(mailHelper).newMultipartMail();
		LocalDateTime triggerTime = LocalDateTime.now();
		automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
		
	}

	@Test
	public void fileNameOfCfgTest() {
		ReportGenerationConfig cfg = new ReportGenerationConfig();
		String printFormat = "pdf";
		String fileNamePattern = "DDD-{Date}-{Time}-{Week}-filename";
		cfg.setPrintFormat(printFormat);
		cfg.setFileNamePattern(fileNamePattern);
		LocalDateTime triggerDateTime = LocalDateTime.of(2020, 1, 1, 1, 5);
		
		String expected = "DDD-2020-01-01-01-05-KW01-filename.pdf";
		
		String fileName = automaticReportsController.fileNameOfCfg(triggerDateTime, cfg);
		assertEquals(expected, fileName);
	}


	@Test
	public void testCheckCyclicGenerationSlot() {
		LocalDateTime now = LocalDateTime.now(ZoneId.of("Europe/Berlin"));
		int weekDay = now.getDayOfWeek().getValue();
		int hour = now.getHour();
		int minute = now.getMinute();
		
		int minuteGE = ( minute / 5) * 5;
		int minuteLE = minuteGE + 5 - 1;

		automaticReportsController.checkCyclicGenerationSlot();

		Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(weekDay, hour, minuteGE, minuteLE);

	}
	private ReportGenerationConfig sampleReportGenerationConfig() {
		ReportGenerationConfig config = new ReportGenerationConfig();
		
		Integer triggerHour = 1;
		Integer triggerMinute = 1;
		Integer triggerWeekDay = 1;
		Integer validFromDayOffset = -1;
		Integer validFromHour = 2;
		Integer validFromMinute = 30;
		Integer validToDayOffset = 1;
		Integer validToHour = 3;
		Integer validToMinute = 35;
		Long standByListId = 23L;
		Long statusId = 4L;
		String fileNamePattern = "pattern";
		String name = "name";
		String printFormat = "pdf";
		String reportName = "REPORT_NAME";
		String subject = "subject";
		config.setFileNamePattern(fileNamePattern);
		config.setName(name);
		config.setPrintFormat(printFormat);
		config.setReportName(reportName);
		config.setStandByListId(standByListId);
		config.setStatusId(statusId);
		config.setSubject(subject);
		config.setTriggerHour(triggerHour);
		config.setTriggerMinute(triggerMinute);
		config.setTriggerWeekDay(triggerWeekDay);
		config.setValidFromDayOffset(validFromDayOffset);
		config.setValidFromHour(validFromHour);
		config.setValidFromMinute(validFromMinute);
		config.setValidToDayOffset(validToDayOffset);
		config.setValidToHour(validToHour);
		config.setValidToMinute(validToMinute);
		List<String> to = new ArrayList<>();
		to.add("email@test.tld");
		config.setTo(to);
		config.setEmailText("emailText");
		return config;
	}


}
