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

import it.sw.pa.comune.artegna.domain.Conferma;
import it.sw.pa.comune.artegna.repository.ConfermaRepository;
import it.sw.pa.comune.artegna.service.ConfermaService;
import it.sw.pa.comune.artegna.service.dto.ConfermaDTO;
import it.sw.pa.comune.artegna.service.mapper.ConfermaMapper;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
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.Conferma}.
 */
@Service
@Transactional
public class ConfermaServiceImpl implements ConfermaService {

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

    private final ConfermaRepository confermaRepository;

    private final ConfermaMapper confermaMapper;

    public ConfermaServiceImpl(ConfermaRepository confermaRepository, ConfermaMapper confermaMapper) {
        this.confermaRepository = confermaRepository;
        this.confermaMapper = confermaMapper;
    }

    @Override
    public ConfermaDTO save(ConfermaDTO confermaDTO) {
        LOG.debug("Request to save Conferma : {}", confermaDTO);
        Conferma conferma = confermaMapper.toEntity(confermaDTO);
        conferma = confermaRepository.save(conferma);
        return confermaMapper.toDto(conferma);
    }

    @Override
    public ConfermaDTO update(ConfermaDTO confermaDTO) {
        LOG.debug("Request to update Conferma : {}", confermaDTO);
        Conferma conferma = confermaMapper.toEntity(confermaDTO);
        conferma = confermaRepository.save(conferma);
        return confermaMapper.toDto(conferma);
    }

    @Override
    public Optional<ConfermaDTO> partialUpdate(ConfermaDTO confermaDTO) {
        LOG.debug("Request to partially update Conferma : {}", confermaDTO);

        return confermaRepository
            .findById(confermaDTO.getId())
            .map(existingConferma -> {
                confermaMapper.partialUpdate(existingConferma, confermaDTO);

                return existingConferma;
            })
            .map(confermaRepository::save)
            .map(confermaMapper::toDto);
    }

    public Page<ConfermaDTO> findAllWithEagerRelationships(Pageable pageable) {
        return confermaRepository.findAllWithEagerRelationships(pageable).map(confermaMapper::toDto);
    }

    /**
     *  Get all the confermas where Prenotazione is {@code null}.
     *  @return the list of entities.
     */
    @Transactional(readOnly = true)
    public List<ConfermaDTO> findAllWherePrenotazioneIsNull() {
        LOG.debug("Request to get all confermas where Prenotazione is null");
        return StreamSupport.stream(confermaRepository.findAll().spliterator(), false)
            .filter(conferma -> conferma.getPrenotazione() == null)
            .map(confermaMapper::toDto)
            .collect(Collectors.toCollection(LinkedList::new));
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<ConfermaDTO> findOne(Long id) {
        LOG.debug("Request to get Conferma : {}", id);
        return confermaRepository.findOneWithEagerRelationships(id).map(confermaMapper::toDto);
    }

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