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

import io.gmss.fiscad.entities.rfu.metier.Batiment;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.metier.BatimentService;
import io.gmss.fiscad.repositories.rfu.metier.BatimentRepository;
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 BatimentServiceImpl implements BatimentService {

    private final BatimentRepository batimentRepository;

    public BatimentServiceImpl(BatimentRepository batimentRepository) {
        this.batimentRepository = batimentRepository;
    }

    @Override
    public Batiment createBatiment(Batiment batiment) throws BadRequestException {
        if (batiment.getId() != null) {
            throw new BadRequestException("Impossible de créer un nouveau batiment ayant un id non null.");
        }
        return batimentRepository.save(batiment);
    }

    @Override
    public Batiment updateBatiment(Long id, Batiment batiment) throws NotFoundException {
        if (batiment.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour un nouveau batiment ayant un id null.");
        }
        if (!batimentRepository.existsById(batiment.getId())) {
            throw new NotFoundException("Impossible de trouver le batiment spécifié dans notre base de données.");
        }
        return batimentRepository.save(batiment);
    }

    @Override
    public void deleteBatiment(Long id) throws NotFoundException {
        Optional<Batiment> batimentOptional = batimentRepository.findById(id);
        if (batimentOptional.isPresent()) {
            batimentRepository.deleteById(batimentOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver le batiment spécifié dans notre base de données.");
        }
    }

    @Override
    public Page<Batiment> getBatimentList(Pageable pageable) {
        return batimentRepository.findAll(pageable);
    }

    @Override
    public List<Batiment> getBatimentList() {
        return batimentRepository.findAll();
    }


    @Override
    public Optional<Batiment> getBatimentById(Long id) {
        if (batimentRepository.existsById(id)) {
            return batimentRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la caractéristique spécifiée dans la base de données.");
        }

    }
}
