package io.gmss.fiscad.implementations.decoupage;

import io.gmss.fiscad.entities.decoupage.Nationalite;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.decoupage.NationaliteService;
import io.gmss.fiscad.repositories.decoupage.NationaliteRepository;
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 NationaliteServiceImpl implements NationaliteService {

    private final NationaliteRepository nationaliteRepository;

    public NationaliteServiceImpl(NationaliteRepository nationaliteRepository) {
        this.nationaliteRepository = nationaliteRepository;
    }

    @Override
    public Nationalite createNationalite(Nationalite nationalite) throws BadRequestException {
        if (nationalite.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle nationalité ayant un id non null.");
        }
        return nationaliteRepository.save(nationalite);
    }

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

    @Override
    public void deleteNationalite(Long id) throws NotFoundException {
        Optional<Nationalite> nationaliteOptional = nationaliteRepository.findById(id);
        if (nationaliteOptional.isPresent()) {
            nationaliteRepository.deleteById(nationaliteOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la nationalité spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<Nationalite> getNationaliteList(Pageable pageable) {
        return nationaliteRepository.findAll(pageable);
    }

    @Override
    public List<Nationalite> getNationaliteList() {
        return nationaliteRepository.findAllByOrderByLibelleAsc();
    }


    @Override
    public Optional<Nationalite> getNationaliteById(Long id) {
        if (nationaliteRepository.existsById(id)) {
            return nationaliteRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la nationalité spécifiée dans la base de données.");
        }

    }
}
