package it.sw.pa.comune.artegna.service.impl;

import it.sw.pa.comune.artegna.domain.Messaggio;
import it.sw.pa.comune.artegna.repository.MessaggioRepository;
import it.sw.pa.comune.artegna.service.MessaggioService;
import it.sw.pa.comune.artegna.service.dto.MessaggioDTO;
import it.sw.pa.comune.artegna.service.mapper.MessaggioMapper;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Service Implementation for managing {@link it.sw.pa.comune.artegna.domain.Messaggio}.
 */
@Service
@Transactional
public class MessaggioServiceImpl implements MessaggioService {

    private static final Logger LOG = LoggerFactory.getLogger(MessaggioServiceImpl.class);

    private final MessaggioRepository messaggioRepository;

    private final MessaggioMapper messaggioMapper;

    public MessaggioServiceImpl(MessaggioRepository messaggioRepository, MessaggioMapper messaggioMapper) {
        this.messaggioRepository = messaggioRepository;
        this.messaggioMapper = messaggioMapper;
    }

    @Override
    public MessaggioDTO save(MessaggioDTO messaggioDTO) {
        LOG.debug("Request to save Messaggio : {}", messaggioDTO);
        Messaggio messaggio = messaggioMapper.toEntity(messaggioDTO);
        messaggio = messaggioRepository.save(messaggio);
        return messaggioMapper.toDto(messaggio);
    }

    @Override
    public MessaggioDTO update(MessaggioDTO messaggioDTO) {
        LOG.debug("Request to update Messaggio : {}", messaggioDTO);
        Messaggio messaggio = messaggioMapper.toEntity(messaggioDTO);
        messaggio = messaggioRepository.save(messaggio);
        return messaggioMapper.toDto(messaggio);
    }

    @Override
    public Optional<MessaggioDTO> partialUpdate(MessaggioDTO messaggioDTO) {
        LOG.debug("Request to partially update Messaggio : {}", messaggioDTO);

        return messaggioRepository
            .findById(messaggioDTO.getId())
            .map(existingMessaggio -> {
                messaggioMapper.partialUpdate(existingMessaggio, messaggioDTO);

                return existingMessaggio;
            })
            .map(messaggioRepository::save)
            .map(messaggioMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public List<MessaggioDTO> findAll() {
        LOG.debug("Request to get all Messaggios");
        return messaggioRepository.findAll().stream().map(messaggioMapper::toDto).collect(Collectors.toCollection(LinkedList::new));
    }

    public Page<MessaggioDTO> findAllWithEagerRelationships(Pageable pageable) {
        return messaggioRepository.findAllWithEagerRelationships(pageable).map(messaggioMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<MessaggioDTO> findOne(Long id) {
        LOG.debug("Request to get Messaggio : {}", id);
        return messaggioRepository.findOneWithEagerRelationships(id).map(messaggioMapper::toDto);
    }

    @Override
    public void delete(Long id) {
        LOG.debug("Request to delete Messaggio : {}", id);
        messaggioRepository.deleteById(id);
    }
}
