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

import io.gmss.fiscad.entities.infocad.parametre.PositionRepresentation;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.PositionRepresentationService;
import io.gmss.fiscad.repositories.infocad.parametre.PositionRepresentationRepository;
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 PositionRepresentationServiceImpl implements PositionRepresentationService {

    private final PositionRepresentationRepository positionRepresentationRepository;

    public PositionRepresentationServiceImpl(PositionRepresentationRepository positionRepresentationRepository) {
        this.positionRepresentationRepository = positionRepresentationRepository;
    }

    @Override
    public PositionRepresentation createPositionRepresentation(PositionRepresentation positionRepresentation) throws BadRequestException {
        if (positionRepresentation.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle position de représentation ayant un id non null.");
        }
        return positionRepresentationRepository.save(positionRepresentation);
    }

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

    @Override
    public void deletePositionRepresentation(Long id) throws NotFoundException {
        Optional<PositionRepresentation> positionRepresentationOptional = positionRepresentationRepository.findById(id);
        if (positionRepresentationOptional.isPresent()) {
            positionRepresentationRepository.deleteById(positionRepresentationOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la position de représentation spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<PositionRepresentation> getPositionRepresentationList(Pageable pageable) {
        return positionRepresentationRepository.findAll(pageable);
    }

    @Override
    public List<PositionRepresentation> getPositionRepresentationList() {
        return positionRepresentationRepository.findAll();
    }

    @Override
    public Optional<PositionRepresentation> getPositionRepresentationById(Long id) {
        if (positionRepresentationRepository.existsById(id)) {
            return positionRepresentationRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la position de représentation spécifiée dans la base de données.");
        }

    }
}
