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

import io.gmss.fiscad.entities.rfu.metier.CaracteristiqueUniteLogement;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.metier.CaracteristiqueUniteLogementService;
import io.gmss.fiscad.repositories.rfu.metier.CaracteristiqueUniteLogementRepository;
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 CaracteristiqueUniteLogementServiceImpl implements CaracteristiqueUniteLogementService {

    private final CaracteristiqueUniteLogementRepository caracteristiqueUniteLogementRepository;

    public CaracteristiqueUniteLogementServiceImpl(CaracteristiqueUniteLogementRepository caracteristiqueUniteLogementRepository) {
        this.caracteristiqueUniteLogementRepository = caracteristiqueUniteLogementRepository;
    }

    @Override
    public CaracteristiqueUniteLogement createCaracteristiqueUniteLogement(CaracteristiqueUniteLogement caracteristiqueUniteLogement) throws BadRequestException {
        if (caracteristiqueUniteLogement.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle caracteristique d'unité de logement ayant un id non null.");
        }
        return caracteristiqueUniteLogementRepository.save(caracteristiqueUniteLogement);
    }

    @Override
    public CaracteristiqueUniteLogement updateCaracteristiqueUniteLogement(Long id, CaracteristiqueUniteLogement caracteristiqueUniteLogement) throws NotFoundException {
        if (caracteristiqueUniteLogement.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle caracteristique d'unité de logement ayant un id null.");
        }
        if (!caracteristiqueUniteLogementRepository.existsById(caracteristiqueUniteLogement.getId())) {
            throw new NotFoundException("Impossible de trouver la nouvelle caracteristique d'unité de logement spécifiée dans notre base de données.");
        }
        return caracteristiqueUniteLogementRepository.save(caracteristiqueUniteLogement);
    }

    @Override
    public void deleteCaracteristiqueUniteLogement(Long id) throws NotFoundException {
        Optional<CaracteristiqueUniteLogement> caracteristiqueUniteLogementOptional = caracteristiqueUniteLogementRepository.findById(id);
        if (caracteristiqueUniteLogementOptional.isPresent()) {
            caracteristiqueUniteLogementRepository.deleteById(caracteristiqueUniteLogementOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la nouvelle caracteristique d'unité de logement spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<CaracteristiqueUniteLogement> getCaracteristiqueUniteLogementList(Pageable pageable) {
        return caracteristiqueUniteLogementRepository.findAll(pageable);
    }

    @Override
    public List<CaracteristiqueUniteLogement> getCaracteristiqueUniteLogementList() {
        return caracteristiqueUniteLogementRepository.findAll();
    }


    @Override
    public Optional<CaracteristiqueUniteLogement> getCaracteristiqueUniteLogementById(Long id) {
        if (caracteristiqueUniteLogementRepository.existsById(id)) {
            return caracteristiqueUniteLogementRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la caracteristique d'unité de logement spécifiée dans la base de données.");
        }

    }
}
