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

import io.gmss.fiscad.entities.rfu.metier.CaracteristiqueParcelle;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.metier.CaracteristiqueParcelleService;
import io.gmss.fiscad.repositories.rfu.metier.CaracteristiqueParcelleRepository;
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 CaracteristiqueParcelleServiceImpl implements CaracteristiqueParcelleService {

    private final CaracteristiqueParcelleRepository caracteristiqueParcelleRepository;

    public CaracteristiqueParcelleServiceImpl(CaracteristiqueParcelleRepository caracteristiqueParcelleRepository) {
        this.caracteristiqueParcelleRepository = caracteristiqueParcelleRepository;
    }

    @Override
    public CaracteristiqueParcelle createCaracteristiqueParcelle(CaracteristiqueParcelle caracteristiqueParcelle) throws BadRequestException {
        if (caracteristiqueParcelle.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle caracteristique de parcelle ayant un id non null.");
        }
        return caracteristiqueParcelleRepository.save(caracteristiqueParcelle);
    }

    @Override
    public CaracteristiqueParcelle updateCaracteristiqueParcelle(Long id, CaracteristiqueParcelle caracteristiqueParcelle) throws NotFoundException {
        if (caracteristiqueParcelle.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle caracteristique de parcelle ayant un id null.");
        }
        if (!caracteristiqueParcelleRepository.existsById(caracteristiqueParcelle.getId())) {
            throw new NotFoundException("Impossible de trouver la nouvelle caracteristique de parcelle spécifié dans notre base de données.");
        }
        return caracteristiqueParcelleRepository.save(caracteristiqueParcelle);
    }

    @Override
    public void deleteCaracteristiqueParcelle(Long id) throws NotFoundException {
        Optional<CaracteristiqueParcelle> caracteristiqueParcelleOptional = caracteristiqueParcelleRepository.findById(id);
        if (caracteristiqueParcelleOptional.isPresent()) {
            caracteristiqueParcelleRepository.deleteById(caracteristiqueParcelleOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la nouvelle caracteristique de parcelle spécifié dans notre base de données.");
        }
    }

    @Override
    public Page<CaracteristiqueParcelle> getCaracteristiqueParcelleList(Pageable pageable) {
        return caracteristiqueParcelleRepository.findAll(pageable);
    }

    @Override
    public List<CaracteristiqueParcelle> getCaracteristiqueParcelleList() {
        return caracteristiqueParcelleRepository.findAll();
    }


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

    }
}
