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

import io.gmss.fiscad.entities.infocad.parametre.SourceDroit;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.SourceDroitService;
import io.gmss.fiscad.repositories.infocad.parametre.SourceDroitRepository;
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 SourceDroitServiceImpl implements SourceDroitService {

    private final SourceDroitRepository sourceDroitRepository;

    public SourceDroitServiceImpl(SourceDroitRepository sourceDroitRepository) {
        this.sourceDroitRepository = sourceDroitRepository;
    }

    @Override
    public SourceDroit createSourceDroit(SourceDroit sourceDroit) throws BadRequestException {
        if (sourceDroit.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle source de droit ayant un id non null.");
        }
        return sourceDroitRepository.save(sourceDroit);
    }

    @Override
    public SourceDroit updateSourceDroit(Long id, SourceDroit sourceDroit) throws NotFoundException {
        if (sourceDroit.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle source de droit ayant un id null.");
        }
        if (!sourceDroitRepository.existsById(sourceDroit.getId())) {
            throw new NotFoundException("Impossible de trouver la source de droit spécifiée dans notre base de données.");
        }
        return sourceDroitRepository.save(sourceDroit);
    }

    @Override
    public void deleteSourceDroit(Long id) throws NotFoundException {
        Optional<SourceDroit> sourceDroitOptional = sourceDroitRepository.findById(id);
        if (sourceDroitOptional.isPresent()) {
            sourceDroitRepository.deleteById(sourceDroitOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la source de droit spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<SourceDroit> getSourceDroitList(Pageable pageable) {
        return sourceDroitRepository.findAll(pageable);
    }

    @Override
    public List<SourceDroit> getSourceDroitList() {
        return sourceDroitRepository.findAll();
    }


    @Override
    public Optional<SourceDroit> getSourceDroitById(Long id) {
        if (sourceDroitRepository.existsById(id)) {
            return sourceDroitRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la source de droit spécifiée dans la base de données.");
        }

    }
}
