package com.sn.sowsysrestapi.api.converter;

import com.sn.sowsysrestapi.api.dto.UserBasicInfoDTO;
import com.sn.sowsysrestapi.api.dto.UserDTO;
import com.sn.sowsysrestapi.api.dto.UserWithActivationCodeAndStatusDTO;
import com.sn.sowsysrestapi.api.dto.input.UserInputDTO;
import com.sn.sowsysrestapi.api.dto.input.UserInputUpdateDTO;
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.List;
import java.util.stream.Collectors;

@Component
public class UserConverter implements Converter<User, UserDTO, UserInputDTO> {

    @Autowired
    private ModelMapper modelMapper;

    //@Autowired
    private ReportDirectory reportDirectory;

    @Override
    public User toEntity(UserInputDTO userInputDTO) {

        return modelMapper.map(userInputDTO, User.class);
    }

    public void copyToEntity(UserInputDTO userInputDTO, User user){

        user.setReportDirectory(new ReportDirectory());

        modelMapper.map(userInputDTO, user);
    }

    public void copyToEntity(UserInputUpdateDTO userInputUpdateDTO, User user){

        user.setReportDirectory(new ReportDirectory());

        modelMapper.map(userInputUpdateDTO, user);
    }

    public void copyToEntityChangeStatus(UserWithActivationCodeAndStatusDTO userWithActivationCodeAndStatusDTO, User user){

        user.setReportDirectory(new ReportDirectory());

        modelMapper.map(userWithActivationCodeAndStatusDTO, user);
    }

    @Override
    public UserDTO toDto(User user) {

        return modelMapper.map(user, UserDTO.class);
    }

    //@Override
    public UserWithActivationCodeAndStatusDTO toDtoWithAccStatus(User user) {

        return modelMapper.map(user, UserWithActivationCodeAndStatusDTO.class);
    }

    //@Override
    public UserBasicInfoDTO toBasicInfoDto(User user) {

        return modelMapper.map(user, UserBasicInfoDTO.class);
    }

    @Override
    public List<UserDTO> toCollectionDTO(List<User> userList) {
        return userList.stream()
                .map(user -> toDto(user))
                .collect(Collectors.toList());
    }

    public List<UserBasicInfoDTO> toCollectionWithUserBasicInfoDTO(List<User> userList) {
        return  userList.stream()
                .map(user -> toBasicInfoDto(user))
                .collect(Collectors.toList());
    }


}
