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

import io.gmss.fiscad.entities.rfu.parametre.Caracteristique;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.parametre.CaracteristiqueService;
import io.gmss.fiscad.repositories.rfu.parametre.CaracteristiqueRepository;
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 CaracteristiqueServiceImpl implements CaracteristiqueService {

    private final CaracteristiqueRepository caracteristiqueRepository;

    public CaracteristiqueServiceImpl(CaracteristiqueRepository caracteristiqueRepository) {
        this.caracteristiqueRepository = caracteristiqueRepository;
    }

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

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

    @Override
    public void deleteCaracteristique(Long id) throws NotFoundException {
        Optional<Caracteristique> caracteristiqueOptional = caracteristiqueRepository.findById(id);
        if (caracteristiqueOptional.isPresent()) {
            caracteristiqueRepository.deleteById(caracteristiqueOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la caractéristique spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<Caracteristique> getCaracteristiqueList(Pageable pageable) {
        return caracteristiqueRepository.findAll(pageable);
    }

    @Override
    public List<Caracteristique> getCaracteristiqueList() {
        return caracteristiqueRepository.findAll();
    }


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

    }
}
