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

import it.sw.pa.comune.artegna.domain.Prenotazione;
import it.sw.pa.comune.artegna.domain.enumeration.StatoPrenotazione;
import it.sw.pa.comune.artegna.repository.PrenotazioneRepository;
import it.sw.pa.comune.artegna.service.PrenotazioneService;
import it.sw.pa.comune.artegna.service.dto.PrenotazioneDTO;
import it.sw.pa.comune.artegna.service.mapper.PrenotazioneMapper;
import java.util.List;
import java.util.Optional;
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.Prenotazione}.
 */
@Service
@Transactional
public class PrenotazioneServiceImpl implements PrenotazioneService {

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

    private final PrenotazioneRepository prenotazioneRepository;

    private final PrenotazioneMapper prenotazioneMapper;

    public PrenotazioneServiceImpl(PrenotazioneRepository prenotazioneRepository, PrenotazioneMapper prenotazioneMapper) {
        this.prenotazioneRepository = prenotazioneRepository;
        this.prenotazioneMapper = prenotazioneMapper;
    }

    @Override
    public PrenotazioneDTO save(PrenotazioneDTO prenotazioneDTO) {
        LOG.debug("Request to save Prenotazione : {}", prenotazioneDTO);
        Prenotazione prenotazione = prenotazioneMapper.toEntity(prenotazioneDTO);
        prenotazione = prenotazioneRepository.save(prenotazione);
        return prenotazioneMapper.toDto(prenotazione);
    }

    @Override
    public PrenotazioneDTO update(PrenotazioneDTO prenotazioneDTO) {
        LOG.debug("Request to update Prenotazione : {}", prenotazioneDTO);
        Prenotazione prenotazione = prenotazioneMapper.toEntity(prenotazioneDTO);
        prenotazione = prenotazioneRepository.save(prenotazione);
        return prenotazioneMapper.toDto(prenotazione);
    }

    @Override
    public Optional<PrenotazioneDTO> partialUpdate(PrenotazioneDTO prenotazioneDTO) {
        LOG.debug("Request to partially update Prenotazione : {}", prenotazioneDTO);

        return prenotazioneRepository
            .findById(prenotazioneDTO.getId())
            .map(existingPrenotazione -> {
                prenotazioneMapper.partialUpdate(existingPrenotazione, prenotazioneDTO);

                return existingPrenotazione;
            })
            .map(prenotazioneRepository::save)
            .map(prenotazioneMapper::toDto);
    }

    public Page<PrenotazioneDTO> findAllWithEagerRelationships(Pageable pageable) {
        return prenotazioneRepository.findAllWithEagerRelationships(pageable).map(prenotazioneMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<PrenotazioneDTO> findOne(Long id) {
        LOG.debug("Request to get Prenotazione : {}", id);
        return prenotazioneRepository.findOneWithEagerRelationships(id).map(prenotazioneMapper::toDto);
    }

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