package com.sn.sowsysrestapi.api.converter;

import com.sn.sowsysrestapi.api.dto.ReportDTO;
import com.sn.sowsysrestapi.api.dto.input.ReportInputDTO;
import com.sn.sowsysrestapi.api.dto.input.ReportUpdateInputDTO;
import com.sn.sowsysrestapi.api.dto.reportView.ReportBasicInfoWithWorkedHoursDTO;
import com.sn.sowsysrestapi.api.dto.reportView.ReportViewDTO;
import com.sn.sowsysrestapi.domain.entity.Report;
import com.sn.sowsysrestapi.domain.entity.ReportDirectory;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class ReportConverter implements Converter<Report, ReportDTO, ReportInputDTO> {

    @Autowired
    private ModelMapper modelMapper;

    @Override
    public Report toEntity(ReportInputDTO reportInputDTO) {

        // To avoid the error:
        //"...The destination property (...) matches multiple source property hierarchies..."
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

        return modelMapper.map(reportInputDTO, Report.class);
    }

    public void copyToEntity(ReportInputDTO reportInputDTO, Report report){

        report.setCurrentTaskList(new ArrayList<>());
        report.setCompletedTaskList(new ArrayList<>());
        report.setNextPeriodTaskList(new ArrayList<>());
        report.setConcernList(new ArrayList<>());
        report.setSuggestionList(new ArrayList<>());
        report.setTotalWorkedHours(0.0);
        report.setReportDirectory(new ReportDirectory());

        modelMapper.map(reportInputDTO, report);
    }

    public void copyToEntityToUpdate(ReportUpdateInputDTO reportUpdateInputDTO, Report report){

        report.setCurrentTaskList(new ArrayList<>());
        report.setCompletedTaskList(new ArrayList<>());
        report.setNextPeriodTaskList(new ArrayList<>());
        report.setConcernList(new ArrayList<>());
        report.setSuggestionList(new ArrayList<>());
        report.setReportDirectory(report.getReportDirectory());

        modelMapper.map(reportUpdateInputDTO, report);
    }

    @Override
    public ReportDTO toDto(Report report) {
        return modelMapper.map(report, ReportDTO.class);
    }

    public ReportViewDTO toBasicInfoDto(Report report) {

        return modelMapper.map(report, ReportViewDTO.class);
    }

    public ReportBasicInfoWithWorkedHoursDTO toBasicInfoWithWorkedHoursDTO(Report report) {

        return modelMapper.map(report, ReportBasicInfoWithWorkedHoursDTO.class);
    }

    @Override
    public List<ReportDTO> toCollectionDTO(List<Report> reportList) {
        return reportList.stream()
                .map(report -> toDto(report))
                .collect(Collectors.toList());
    }

    public List<ReportViewDTO> toCollectionBasicInfoDTO(List<Report> reportList) {
        return reportList.stream()
                .map(reportBasicInfo -> toBasicInfoDto(reportBasicInfo))
                .collect(Collectors.toList());
    }

    public List<ReportBasicInfoWithWorkedHoursDTO> toCollectionWithReportBasicInfoDTO(List<Report> reportList) {
        return reportList.stream()
                .map(report -> toBasicInfoWithWorkedHoursDTO(report))
                .collect(Collectors.toList());
    }



}
