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

import io.gmss.fiscad.entities.infocad.parametre.SituationMatrimoniale;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.SituationMatrimonialeService;
import io.gmss.fiscad.repositories.infocad.parametre.SituationMatrimonialeRepository;
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 SituationMatrimonialeServiceImpl implements SituationMatrimonialeService {

    private final SituationMatrimonialeRepository situationMatrimonialeRepository;

    public SituationMatrimonialeServiceImpl(SituationMatrimonialeRepository situationMatrimonialeRepository) {
        this.situationMatrimonialeRepository = situationMatrimonialeRepository;
    }

    @Override
    public SituationMatrimoniale createSituationMatrimoniale(SituationMatrimoniale situationMatrimoniale) throws BadRequestException {
        if (situationMatrimoniale.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle situation matrimoniale ayant un id non null.");
        }
        return situationMatrimonialeRepository.save(situationMatrimoniale);
    }

    @Override
    public SituationMatrimoniale updateSituationMatrimoniale(Long id, SituationMatrimoniale situationMatrimoniale) throws NotFoundException {
        if (situationMatrimoniale.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle situation matrimoniale ayant un id null.");
        }
        if (!situationMatrimonialeRepository.existsById(situationMatrimoniale.getId())) {
            throw new NotFoundException("Impossible de trouver la situation matrimoniale spécifiée dans notre base de données.");
        }
        return situationMatrimonialeRepository.save(situationMatrimoniale);
    }

    @Override
    public void deleteSituationMatrimoniale(Long id) throws NotFoundException {
        Optional<SituationMatrimoniale> situationMatrimonialeOptional = situationMatrimonialeRepository.findById(id);
        if (situationMatrimonialeOptional.isPresent()) {
            situationMatrimonialeRepository.deleteById(situationMatrimonialeOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la situation matrimoniale spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<SituationMatrimoniale> getSituationMatrimonialeList(Pageable pageable) {
        return situationMatrimonialeRepository.findAll(pageable);
    }

    @Override
    public List<SituationMatrimoniale> getSituationMatrimonialeList() {
        return situationMatrimonialeRepository.findAll();
    }

    @Override
    public Optional<SituationMatrimoniale> getSituationMatrimonialeById(Long id) {
        if (situationMatrimonialeRepository.existsById(id)) {
            return situationMatrimonialeRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la situation matrimoniale spécifiée dans la base de données.");
        }

    }
}
