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

import it.sw.pa.comune.artegna.domain.ModelloLiberatoria;
import it.sw.pa.comune.artegna.repository.ModelloLiberatoriaRepository;
import it.sw.pa.comune.artegna.service.ModelloLiberatoriaService;
import it.sw.pa.comune.artegna.service.dto.ModelloLiberatoriaDTO;
import it.sw.pa.comune.artegna.service.mapper.ModelloLiberatoriaMapper;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Service Implementation for managing {@link it.sw.pa.comune.artegna.domain.ModelloLiberatoria}.
 */
@Service
@Transactional
public class ModelloLiberatoriaServiceImpl implements ModelloLiberatoriaService {

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

    private final ModelloLiberatoriaRepository modelloLiberatoriaRepository;

    private final ModelloLiberatoriaMapper modelloLiberatoriaMapper;

    public ModelloLiberatoriaServiceImpl(
        ModelloLiberatoriaRepository modelloLiberatoriaRepository,
        ModelloLiberatoriaMapper modelloLiberatoriaMapper
    ) {
        this.modelloLiberatoriaRepository = modelloLiberatoriaRepository;
        this.modelloLiberatoriaMapper = modelloLiberatoriaMapper;
    }

    @Override
    public ModelloLiberatoriaDTO save(ModelloLiberatoriaDTO modelloLiberatoriaDTO) {
        LOG.debug("Request to save ModelloLiberatoria : {}", modelloLiberatoriaDTO);
        ModelloLiberatoria modelloLiberatoria = modelloLiberatoriaMapper.toEntity(modelloLiberatoriaDTO);
        modelloLiberatoria = modelloLiberatoriaRepository.save(modelloLiberatoria);
        return modelloLiberatoriaMapper.toDto(modelloLiberatoria);
    }

    @Override
    public ModelloLiberatoriaDTO update(ModelloLiberatoriaDTO modelloLiberatoriaDTO) {
        LOG.debug("Request to update ModelloLiberatoria : {}", modelloLiberatoriaDTO);
        ModelloLiberatoria modelloLiberatoria = modelloLiberatoriaMapper.toEntity(modelloLiberatoriaDTO);
        modelloLiberatoria = modelloLiberatoriaRepository.save(modelloLiberatoria);
        return modelloLiberatoriaMapper.toDto(modelloLiberatoria);
    }

    @Override
    public Optional<ModelloLiberatoriaDTO> partialUpdate(ModelloLiberatoriaDTO modelloLiberatoriaDTO) {
        LOG.debug("Request to partially update ModelloLiberatoria : {}", modelloLiberatoriaDTO);

        return modelloLiberatoriaRepository
            .findById(modelloLiberatoriaDTO.getId())
            .map(existingModelloLiberatoria -> {
                modelloLiberatoriaMapper.partialUpdate(existingModelloLiberatoria, modelloLiberatoriaDTO);

                return existingModelloLiberatoria;
            })
            .map(modelloLiberatoriaRepository::save)
            .map(modelloLiberatoriaMapper::toDto);
    }

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

    @Override
    @Transactional(readOnly = true)
    public Optional<ModelloLiberatoriaDTO> findOne(Long id) {
        LOG.debug("Request to get ModelloLiberatoria : {}", id);
        return modelloLiberatoriaRepository.findById(id).map(modelloLiberatoriaMapper::toDto);
    }

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