package io.gmss.fiscad.implementations.decoupage;

import io.gmss.fiscad.entities.decoupage.SecteurDecoupage;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.decoupage.SecteurDecoupageService;
import io.gmss.fiscad.repositories.decoupage.SecteurDecoupageRepository;
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 SecteurDecoupageServiceImpl implements SecteurDecoupageService {
    private final SecteurDecoupageRepository secteurDecoupageRepository;

    public SecteurDecoupageServiceImpl(SecteurDecoupageRepository secteurDecoupageRepository) {
        this.secteurDecoupageRepository = secteurDecoupageRepository;
    }

    @Override
    public SecteurDecoupage createSecteurDecoupage(SecteurDecoupage secteurDecoupage) throws BadRequestException {
        if (secteurDecoupage.getId() != null) {
            throw new BadRequestException("Impossible de créer un nouveau secteur découpage ayant un id non null.");
        }
        return secteurDecoupageRepository.save(secteurDecoupage);
    }

    @Override
    public SecteurDecoupage updateSecteurDecoupage(Long id, SecteurDecoupage secteurDecoupage) throws NotFoundException {
        if (secteurDecoupage.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour un nouveau secteur découpage ayant un id null.");
        }
        if (!secteurDecoupageRepository.existsById(secteurDecoupage.getId())) {
            throw new NotFoundException("Impossible de trouver le secteur découpage spécifié.");
        }
        return secteurDecoupageRepository.save(secteurDecoupage);
    }

    @Override
    public void deleteSecteurDecoupage(Long id) throws NotFoundException {
        Optional<SecteurDecoupage> secteurDecoupageOptional = secteurDecoupageRepository.findById(id);
        if (secteurDecoupageOptional.isPresent()) {
            secteurDecoupageRepository.deleteById(secteurDecoupageOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver le secteur découpage spécifié.");
        }
    }

    @Override
    public Page<SecteurDecoupage> getSecteurDecoupageList(Pageable pageable) {
        return secteurDecoupageRepository.findAll(pageable);
    }

    @Override
    public List<SecteurDecoupage> getSecteurDecoupageList() {
        return secteurDecoupageRepository.findAll();
    }


    @Override
    public Optional<SecteurDecoupage> getSecteurDecoupageById(Long id) {
        return secteurDecoupageRepository.findById(id);
    }
}