package io.gmss.fiscad.implementations.rfu.metier;

import io.gmss.fiscad.entities.rfu.metier.EnqueteBatiment;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.metier.EnqueteBatimentService;
import io.gmss.fiscad.repositories.rfu.metier.EnqueteBatimentRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class EnqueteBatimentServiceImpl implements EnqueteBatimentService {

    private final EnqueteBatimentRepository enqueteBatimentRepository;

    public EnqueteBatimentServiceImpl(EnqueteBatimentRepository enqueteBatimentRepository) {
        this.enqueteBatimentRepository = enqueteBatimentRepository;
    }

    @Override
    public EnqueteBatiment createEnqueteBatiment(EnqueteBatiment enqueteBatiment) throws BadRequestException {
        if (enqueteBatiment.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle enquete de batiment ayant un id non null.");
        }
        return enqueteBatimentRepository.save(enqueteBatiment);
    }

    @Override
    public EnqueteBatiment updateEnqueteBatiment(Long id, EnqueteBatiment enqueteBatiment) throws NotFoundException {
        if (enqueteBatiment.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle enquete de batiment ayant un id null.");
        }
        if (!enqueteBatimentRepository.existsById(enqueteBatiment.getId())) {
            throw new NotFoundException("Impossible de trouver la nouvelle enquete de batiment spécifiée dans notre base de données.");
        }
        return enqueteBatimentRepository.save(enqueteBatiment);
    }

    @Override
    public void deleteEnqueteBatiment(Long id) throws NotFoundException {
        Optional<EnqueteBatiment> enqueteBatimentOptional = enqueteBatimentRepository.findById(id);
        if (enqueteBatimentOptional.isPresent()) {
            enqueteBatimentRepository.deleteById(enqueteBatimentOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la nouvelle enquete de batiment spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<EnqueteBatiment> getEnqueteBatimentList(Pageable pageable) {
        return enqueteBatimentRepository.findAll(pageable);
    }

    @Override
    public List<EnqueteBatiment> getEnqueteBatimentList() {
        return enqueteBatimentRepository.findAll();
    }


    @Override
    public Optional<EnqueteBatiment> getEnqueteBatimentById(Long id) {
        if (enqueteBatimentRepository.existsById(id)) {
            return enqueteBatimentRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la nouvelle enquete de batiment spécifiée dans la base de données.");
        }

    }
}
