package gov.samhsa.consent2share.web.controller.report;
import static gov.samhsa.consent2share.infrastructure.report.ReportFormat.HTML;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import gov.samhsa.consent2share.infrastructure.report.AbstractReportConfig;
import gov.samhsa.consent2share.infrastructure.report.AbstractReportController;
import gov.samhsa.consent2share.infrastructure.report.ReportDataProvider;
import gov.samhsa.consent2share.infrastructure.report.ReportUtils;
import gov.samhsa.consent2share.infrastructure.report.ReportFormat;
import gov.samhsa.consent2share.infrastructure.report.RequestScopedParameters;
import gov.samhsa.consent2share.infrastructure.report.RequestScopedParametersProvider;
import gov.samhsa.consent2share.web.config.report.ManagerReportConfig;
import gov.samhsa.consent2share.web.config.report.ReportPath;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
/**
* {@link AbstractReportController} implementation for ManagerReport.
*/
@Controller
@RequestMapping(ReportPath.ADMIN_REPORT_CONTROLLER_BASE_PATH)
public class ManagerReportController extends AbstractReportController {
private ReportUtils reportUtils;
private RequestScopedParametersProvider requestScopedParametersProvider;
/**
* Instantiates a new manager report controller.
*
* @param reportDataProvider the report data provider
* @param abstractReportConfig the abstract report config
* @param reportUtils the report utils
* @param requestScopedParametersProvider the request scoped parameters provider
*/
@Autowired
public ManagerReportController(
@Qualifier(ManagerReportConfig.REPORT_DATA_PROVIDER_NAME) ReportDataProvider reportDataProvider,
@Qualifier(ManagerReportConfig.REPORT_CONFIG_NAME) AbstractReportConfig abstractReportConfig,
ReportUtils reportUtils,
RequestScopedParametersProvider requestScopedParametersProvider) {
super(reportDataProvider, abstractReportConfig);
this.reportUtils = reportUtils;
this.requestScopedParametersProvider = requestScopedParametersProvider;
}
/**
* Handle report request.
*
* @param format
* the format
* @return the model and view
*/
@RequestMapping(method = GET, value = ManagerReportConfig.REPORT_NAME)
public ModelAndView handleReportRequest(
@RequestParam Optional<ReportFormat> format,
@RequestParam @DateTimeFormat(pattern = "MM/dd/yyyy") LocalDate startDate,
@RequestParam @DateTimeFormat(pattern = "MM/dd/yyyy") LocalDate endDate,
@RequestParam Optional<Boolean> noAccountInformation,
@RequestParam Optional<Boolean> noCatagoryDescription) {
final ReportFormat reportFormat = format.orElse(HTML);
Boolean noInformation = noAccountInformation.orElse(false);
Boolean noDescription = noCatagoryDescription.orElse(false);
RequestScopedParameters requestScopedParameters = requestScopedParametersProvider
.getRequestScopedParameters();
LocalDateTime startDateTime = reportUtils.getStartDateTime(startDate);
LocalDateTime endDateTime = reportUtils.getEndDateTime(endDate);
long startSqlTimeStamp = reportUtils
.convertLocalDateTimeToEpoch(startDateTime);
long endSqlTimeStamp = reportUtils
.convertLocalDateTimeToEpoch(endDateTime);
requestScopedParameters
.add("startDateTime",
startDateTime.format(DateTimeFormatter
.ofPattern("MM/dd/yyyy HH:mm:ss")))
.add("endDateTime",
endDateTime.format(DateTimeFormatter
.ofPattern("MM/dd/yyyy HH:mm:ss")))
.add("noInformation", noInformation)
.add("noDescription", noDescription);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
Collection<Object> reportData = this.reportDataProvider
.getReportData(args);
if (reportData.size() == 0) {
return new ModelAndView("views/Administrator/noReportDataFound");
} else {
return reportModelAndView(reportFormat, () -> reportData);
}
}
}