package io.gmss.fiscad.implementations.decoupage;

import io.gmss.fiscad.entities.decoupage.Departement;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.decoupage.DepartementService;
import io.gmss.fiscad.repositories.decoupage.DepartementRepository;
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 DepartementServiceImpl implements DepartementService {

    private final DepartementRepository departementRepository;

    public DepartementServiceImpl(DepartementRepository departementRepository) {
        this.departementRepository = departementRepository;
    }

    @Override
    public Departement createDepartement(Departement departement) throws BadRequestException {
        if (departement.getId() != null) {
            throw new BadRequestException("Impossible de créer un nouveau département ayant un id non null.");
        }
        return departementRepository.save(departement);
    }

    @Override
    public Departement updateDepartement(Long id, Departement departement) throws NotFoundException {
        if (departement.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour un nouveau département ayant un id null.");
        }
        if (!departementRepository.existsById(departement.getId())) {
            throw new NotFoundException("Impossible de trouver le département spécifié dans notre base de données.");
        }
        return departementRepository.save(departement);
    }

    @Override
    public void deleteDepartement(Long id) throws NotFoundException {
        Optional<Departement> departementOptional = departementRepository.findById(id);
        if (departementOptional.isPresent()) {
            departementRepository.deleteById(departementOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver le département spécifié dans notre base de données.");
        }
    }

    @Override
    public Page<Departement> getDepartementList(Pageable pageable) {
        return departementRepository.findAll(pageable);
    }

    @Override
    public List<Departement> getDepartementList() {
        return departementRepository.findAll();
    }


    @Override
    public Optional<Departement> getDepartementById(Long id) {
        if (departementRepository.existsById(id)) {
            return departementRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver le département spécifié dans la base de données.");
        }

    }
}
