package com.sn.sowsysrestapi.api.controller;

import com.sn.sowsysrestapi.api.converter.ReportConverter;
import com.sn.sowsysrestapi.api.converter.ReportFullViewConverter;
import com.sn.sowsysrestapi.api.converter.UserConverter;
import com.sn.sowsysrestapi.api.dto.UserBasicInfoDTO;
import com.sn.sowsysrestapi.api.dto.reportView.ReportFullViewDTO;
import com.sn.sowsysrestapi.api.dto.reportView.ReportViewDTO;
import com.sn.sowsysrestapi.domain.entity.User;
import com.sn.sowsysrestapi.domain.infrastructure.service.report.PdfReportService;
import com.sn.sowsysrestapi.domain.repository.ReportRepo;
import com.sn.sowsysrestapi.domain.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.util.List;

@RestController
@RequestMapping("/api/reports")
public class ReportViewController {

    @Autowired
    ReportFullViewConverter reportFullViewConverter;

    @Autowired
    ReportRepo reportRepo;

    @Autowired
    private UserService userService;

    @Autowired
    private UserConverter userConverter;

    @Autowired
    private ReportConverter reportConverter;

    @Autowired
    private PdfReportService pdfReportService;

    @GetMapping(path = "/full-report", produces = MediaType.APPLICATION_JSON_VALUE)
    public ReportFullViewDTO getFullReport(
            @RequestParam String userCode,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {

        User user = userService.findOrFail(userCode);
        UserBasicInfoDTO userBasicInfoDTO = userConverter.toBasicInfoDto(user);

        Long reportDirectoryId = reportRepo.getReportDirectoryId(userCode);

        List<ReportViewDTO> reportBasicInfoDTOList =
                reportConverter.toCollectionBasicInfoDTO(
                        reportRepo.findByReportDirectoryAndStartDateAndEndDate(reportDirectoryId, startDate, endDate));

        ReportFullViewDTO reportFullViewDTO = new ReportFullViewDTO();
        reportFullViewDTO.setUser(userBasicInfoDTO);
        reportFullViewDTO.setReportList(reportBasicInfoDTOList);

        return reportFullViewDTO;
    }

    @GetMapping(path = "/full-report", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<byte[]> getFullReportPdf(
            @RequestParam String userCode,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {

        byte[] bytesPdf = pdfReportService.issuePdfReport(userCode, startDate, endDate);

        var headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=sow-report.pdf");

        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_PDF)
                .headers(headers)
                .body(bytesPdf);

    }

    @GetMapping("/user-full-reports")
    public ReportFullViewDTO getFullReportList(@RequestParam String userCode) {

        User user = userService.findOrFail(userCode);
        UserBasicInfoDTO userBasicInfoDTO = userConverter.toBasicInfoDto(user);

        Long reportDirectoryId = reportRepo.getReportDirectoryId(userCode);

        List<ReportViewDTO> reportBasicInfoDTOList =
                reportConverter.toCollectionBasicInfoDTO(
                        reportRepo.findByReportDirectoryId(reportDirectoryId));

        ReportFullViewDTO reportFullViewDTO = new ReportFullViewDTO();
        reportFullViewDTO.setUser(userBasicInfoDTO);
        reportFullViewDTO.setReportList(reportBasicInfoDTOList);

        return reportFullViewDTO;
    }


}
