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

import io.gmss.fiscad.entities.infocad.parametre.TypePiece;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.TypePieceService;
import io.gmss.fiscad.repositories.infocad.parametre.TypePieceRepository;
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 TypePieceServiceImpl implements TypePieceService {

    private final TypePieceRepository typePieceRepository;

    public TypePieceServiceImpl(TypePieceRepository typePieceRepository) {
        this.typePieceRepository = typePieceRepository;
    }

    @Override
    public TypePiece createTypePiece(TypePiece typePiece) throws BadRequestException {
        if (typePiece.getId() != null) {
            throw new BadRequestException("Impossible de créer un nouveau type de pièce ayant un id non null.");
        }
        return typePieceRepository.save(typePiece);
    }

    @Override
    public TypePiece updateTypePiece(Long id, TypePiece typePiece) throws NotFoundException {
        if (typePiece.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour un nouveau type de pièce ayant un id null.");
        }
        if (!typePieceRepository.existsById(typePiece.getId())) {
            throw new NotFoundException("Impossible de trouver le type de pièce spécifié dans notre base de données.");
        }
        return typePieceRepository.save(typePiece);
    }

    @Override
    public void deleteTypePiece(Long id) throws NotFoundException {
        Optional<TypePiece> typePieceOptional = typePieceRepository.findById(id);
        if (typePieceOptional.isPresent()) {
            typePieceRepository.deleteById(typePieceOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver le type de pièce spécifié dans notre base de données.");
        }
    }

    @Override
    public Page<TypePiece> getTypePieceList(Pageable pageable) {
        return typePieceRepository.findAll(pageable);
    }

    @Override
    public List<TypePiece> getTypePieceList() {
        return typePieceRepository.findAll();
    }

    @Override
    public Optional<TypePiece> getTypePieceById(Long id) {
        if (typePieceRepository.existsById(id)) {
            return typePieceRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver le type de pièce spécifié dans la base de données.");
        }

    }
}
