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

import it.sw.pa.comune.artegna.domain.Disponibilita;
import it.sw.pa.comune.artegna.repository.DisponibilitaRepository;
import it.sw.pa.comune.artegna.service.DisponibilitaService;
import it.sw.pa.comune.artegna.service.dto.DisponibilitaDTO;
import it.sw.pa.comune.artegna.service.mapper.DisponibilitaMapper;
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.Disponibilita}.
 */
@Service
@Transactional
public class DisponibilitaServiceImpl implements DisponibilitaService {

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

    private final DisponibilitaRepository disponibilitaRepository;

    private final DisponibilitaMapper disponibilitaMapper;

    public DisponibilitaServiceImpl(DisponibilitaRepository disponibilitaRepository, DisponibilitaMapper disponibilitaMapper) {
        this.disponibilitaRepository = disponibilitaRepository;
        this.disponibilitaMapper = disponibilitaMapper;
    }

    @Override
    public DisponibilitaDTO save(DisponibilitaDTO disponibilitaDTO) {
        LOG.debug("Request to save Disponibilita : {}", disponibilitaDTO);
        Disponibilita disponibilita = disponibilitaMapper.toEntity(disponibilitaDTO);
        disponibilita = disponibilitaRepository.save(disponibilita);
        return disponibilitaMapper.toDto(disponibilita);
    }

    @Override
    public DisponibilitaDTO update(DisponibilitaDTO disponibilitaDTO) {
        LOG.debug("Request to update Disponibilita : {}", disponibilitaDTO);
        Disponibilita disponibilita = disponibilitaMapper.toEntity(disponibilitaDTO);
        disponibilita = disponibilitaRepository.save(disponibilita);
        return disponibilitaMapper.toDto(disponibilita);
    }

    @Override
    public Optional<DisponibilitaDTO> partialUpdate(DisponibilitaDTO disponibilitaDTO) {
        LOG.debug("Request to partially update Disponibilita : {}", disponibilitaDTO);

        return disponibilitaRepository
            .findById(disponibilitaDTO.getId())
            .map(existingDisponibilita -> {
                disponibilitaMapper.partialUpdate(existingDisponibilita, disponibilitaDTO);

                return existingDisponibilita;
            })
            .map(disponibilitaRepository::save)
            .map(disponibilitaMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public Page<DisponibilitaDTO> findAll(Pageable pageable) {
        LOG.debug("Request to get all Disponibilitas");
        return disponibilitaRepository.findAll(pageable).map(disponibilitaMapper::toDto);
    }

    public Page<DisponibilitaDTO> findAllWithEagerRelationships(Pageable pageable) {
        return disponibilitaRepository.findAllWithEagerRelationships(pageable).map(disponibilitaMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<DisponibilitaDTO> findOne(Long id) {
        LOG.debug("Request to get Disponibilita : {}", id);
        return disponibilitaRepository.findOneWithEagerRelationships(id).map(disponibilitaMapper::toDto);
    }

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