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

import io.gmss.fiscad.entities.infocad.parametre.NatureDomaine;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.NatureDomaineService;
import io.gmss.fiscad.repositories.infocad.parametre.NatureDomaineRepository;
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 NatureDomaineServiceImpl implements NatureDomaineService {

    private final NatureDomaineRepository natureDomaineRepository;

    public NatureDomaineServiceImpl(NatureDomaineRepository natureDomaineRepository) {
        this.natureDomaineRepository = natureDomaineRepository;
    }

    @Override
    public NatureDomaine createNatureDomaine(NatureDomaine natureDomaine) throws BadRequestException {
        if (natureDomaine.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle nature domaine ayant un id non null.");
        }
        return natureDomaineRepository.save(natureDomaine);
    }

    @Override
    public NatureDomaine updateNatureDomaine(Long id, NatureDomaine natureDomaine) throws NotFoundException {
        if (natureDomaine.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle nature domaine ayant un id null.");
        }
        if (!natureDomaineRepository.existsById(natureDomaine.getId())) {
            throw new NotFoundException("Impossible de trouver la nature domaine spécifiée dans notre base de données.");
        }
        return natureDomaineRepository.save(natureDomaine);
    }

    @Override
    public void deleteNatureDomaine(Long id) throws NotFoundException {
        Optional<NatureDomaine> natureDomaineOptional = natureDomaineRepository.findById(id);
        if (natureDomaineOptional.isPresent()) {
            natureDomaineRepository.deleteById(natureDomaineOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la nature domaine spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<NatureDomaine> getNatureDomaineList(Pageable pageable) {
        return natureDomaineRepository.findAll(pageable);
    }

    @Override
    public List<NatureDomaine> getNatureDomaineList() {
        return natureDomaineRepository.findAll();
    }

    @Override
    public Optional<NatureDomaine> getNatureDomaineById(Long id) {
        if (natureDomaineRepository.existsById(id)) {
            return natureDomaineRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la nature domaine spécifiée dans la base de données.");
        }

    }
}
