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

import it.sw.pa.comune.artegna.domain.Prenotazione;
import it.sw.pa.comune.artegna.domain.Struttura;
import it.sw.pa.comune.artegna.domain.enumeration.StatoPrenotazione;
import it.sw.pa.comune.artegna.repository.StrutturaRepository;
import it.sw.pa.comune.artegna.service.StrutturaService;
import it.sw.pa.comune.artegna.service.dto.StrutturaDTO;
import it.sw.pa.comune.artegna.service.mapper.StrutturaMapper;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Service Implementation for managing {@link it.sw.pa.comune.artegna.domain.Struttura}.
 */
@Service
@Transactional
public class StrutturaServiceImpl implements StrutturaService {

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

    private final StrutturaRepository strutturaRepository;

    private final StrutturaMapper strutturaMapper;

    public StrutturaServiceImpl(StrutturaRepository strutturaRepository, StrutturaMapper strutturaMapper) {
        this.strutturaRepository = strutturaRepository;
        this.strutturaMapper = strutturaMapper;
    }

    @Override
    public StrutturaDTO save(StrutturaDTO strutturaDTO) {
        LOG.debug("Request to save Struttura : {}", strutturaDTO);
        Struttura struttura = strutturaMapper.toEntity(strutturaDTO);
        struttura = strutturaRepository.save(struttura);
        return strutturaMapper.toDto(struttura);
    }

    @Override
    public StrutturaDTO update(StrutturaDTO strutturaDTO) {
        LOG.debug("Request to update Struttura : {}", strutturaDTO);
        Struttura struttura = strutturaMapper.toEntity(strutturaDTO);
        struttura = strutturaRepository.save(struttura);
        return strutturaMapper.toDto(struttura);
    }

    @Override
    public Optional<StrutturaDTO> partialUpdate(StrutturaDTO strutturaDTO) {
        LOG.debug("Request to partially update Struttura : {}", strutturaDTO);

        return strutturaRepository
            .findById(strutturaDTO.getId())
            .map(existingStruttura -> {
                strutturaMapper.partialUpdate(existingStruttura, strutturaDTO);

                return existingStruttura;
            })
            .map(strutturaRepository::save)
            .map(strutturaMapper::toDto);
    }

    @Override
    @Transactional(readOnly = true)
    public Optional<StrutturaDTO> findOne(Long id) {
        LOG.debug("Request to get Struttura : {}", id);
        return strutturaRepository.findById(id).map(strutturaMapper::toDto);
    }

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