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

import io.gmss.fiscad.entities.infocad.parametre.Profession;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.ProfessionService;
import io.gmss.fiscad.repositories.infocad.parametre.ProfessionRepository;
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 ProfessionServiceImpl implements ProfessionService {

    private final ProfessionRepository professionRepository;

    public ProfessionServiceImpl(ProfessionRepository professionRepository) {
        this.professionRepository = professionRepository;
    }

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

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

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

    @Override
    public Page<Profession> getProfessionList(Pageable pageable) {
        return professionRepository.findAll(pageable);
    }

    @Override
    public List<Profession> getProfessionList() {
        return professionRepository.findAll();
    }

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

    }
}
