package com.sn.sowsysrestapi.api.converter;

import com.sn.sowsysrestapi.api.dto.ReportDirectoryBasicInfoDTO;
import com.sn.sowsysrestapi.api.dto.ReportDirectoryDTO;
import com.sn.sowsysrestapi.api.dto.input.ReportDirectoryInputDTO;
import com.sn.sowsysrestapi.domain.entity.ReportDirectory;
import com.sn.sowsysrestapi.domain.entity.User;
import org.modelmapper.ModelMapper;
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 ReportDirectoryConverter implements Converter<ReportDirectory, ReportDirectoryDTO, ReportDirectoryInputDTO> {

    @Autowired
    private ModelMapper modelMapper;

    @Override
    public ReportDirectory toEntity(ReportDirectoryInputDTO reportDirectoryInputDTO) {
        return modelMapper.map(reportDirectoryInputDTO, ReportDirectory.class);
    }

    public ReportDirectory toEntity(ReportDirectoryDTO reportDirectoryDTO) {
        return modelMapper.map(reportDirectoryDTO, ReportDirectory.class);
    }

    public void copyToEntity(ReportDirectoryInputDTO reportDirectoryInputDTO, ReportDirectory reportDirectory) {

        reportDirectory.setReportList(new ArrayList<>());

        modelMapper.map(reportDirectoryInputDTO, reportDirectory);
    }

    public void copyToEntity(ReportDirectoryDTO reportDirectoryDTO, ReportDirectory reportDirectory) {

        User user = new User();

        reportDirectory.setReportList(new ArrayList<>());
        reportDirectory.setOwnerCode(user.getUserCode());

        modelMapper.map(reportDirectoryDTO, reportDirectory);
    }

    @Override
    public ReportDirectoryDTO toDto(ReportDirectory reportDirectory) {
        return modelMapper.map(reportDirectory, ReportDirectoryDTO.class);
    }

    //@Override
    public ReportDirectoryInputDTO toInputDto(ReportDirectory reportDirectory) {
        return modelMapper.map(reportDirectory, ReportDirectoryInputDTO.class);
    }


    public ReportDirectoryBasicInfoDTO toBasicInfoDto(ReportDirectory reportDirectory) {
        return modelMapper.map(reportDirectory, ReportDirectoryBasicInfoDTO.class);
    }

    @Override
    public List<ReportDirectoryDTO> toCollectionDTO(List<ReportDirectory> reportDirectoryList) {
        return reportDirectoryList.stream()
                .map(reportDirectory -> toDto(reportDirectory))
                .collect(Collectors.toList());
    }

    public List<ReportDirectoryBasicInfoDTO> toCollectionWithReportBasicInfoDTO(List<ReportDirectory> reportDirectoryList) {
        return reportDirectoryList.stream()
                .map(report -> toBasicInfoDto(report))
                .collect(Collectors.toList());
    }


    public void copyToEntity(ReportDirectory reportDirectoryInput, ReportDirectory reportDirectoryPresent) {

        User user = new User();

        reportDirectoryInput.setReportList(new ArrayList<>());
        reportDirectoryInput.setOwnerCode(user.getUserCode());

        modelMapper.map(reportDirectoryInput, reportDirectoryPresent);
    }
}
