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

import io.gmss.fiscad.entities.rfu.parametre.TypeCaracteristique;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.parametre.TypeCaracteristiqueService;
import io.gmss.fiscad.repositories.rfu.parametre.TypeCaracteristiqueRepository;
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 TypeCaracteristiqueServiceImpl implements TypeCaracteristiqueService {

    private final TypeCaracteristiqueRepository typeCaracteristiqueRepository;

    public TypeCaracteristiqueServiceImpl(TypeCaracteristiqueRepository typeCaracteristiqueRepository) {
        this.typeCaracteristiqueRepository = typeCaracteristiqueRepository;
    }

    @Override
    public TypeCaracteristique createTypeCaracteristique(TypeCaracteristique typeCaracteristique) throws BadRequestException {
        if (typeCaracteristique.getId() != null) {
            throw new BadRequestException("Impossible de créer un nouveau type de caracteristique ayant un id non null.");
        }
        return typeCaracteristiqueRepository.save(typeCaracteristique);
    }

    @Override
    public TypeCaracteristique updateTypeCaracteristique(Long id, TypeCaracteristique typeCaracteristique) throws NotFoundException {
        if (typeCaracteristique.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour un nouveau type caracteristique ayant un id null.");
        }
        if (!typeCaracteristiqueRepository.existsById(typeCaracteristique.getId())) {
            throw new NotFoundException("Impossible de trouver le type caractéristique spécifié dans notre base de données.");
        }
        return typeCaracteristiqueRepository.save(typeCaracteristique);
    }

    @Override
    public void deleteTypeCaracteristique(Long id) throws NotFoundException {
        Optional<TypeCaracteristique> typeCaracteristiqueOptional = typeCaracteristiqueRepository.findById(id);
        if (typeCaracteristiqueOptional.isPresent()) {
            typeCaracteristiqueRepository.deleteById(typeCaracteristiqueOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver le type caractéristique spécifié dans notre base de données.");
        }
    }

    @Override
    public Page<TypeCaracteristique> getTypeCaracteristiqueList(Pageable pageable) {
        return typeCaracteristiqueRepository.findAll(pageable);
    }

    @Override
    public List<TypeCaracteristique> getTypeCaracteristiqueList() {
        return typeCaracteristiqueRepository.findAll();
    }


    @Override
    public Optional<TypeCaracteristique> getTypeCaracteristiqueById(Long id) {
        if (typeCaracteristiqueRepository.existsById(id)) {
            return typeCaracteristiqueRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver le type caractéristique spécifié dans la base de données.");
        }

    }
}
