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

import io.gmss.fiscad.entities.rfu.parametre.Campagne;
import io.gmss.fiscad.enums.TypeCampagne;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.rfu.parametre.CampagneService;
import io.gmss.fiscad.repositories.rfu.parametre.CampagneRepository;
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 CampagneServiceImpl implements CampagneService {
    private final CampagneRepository campagneRepository;

    public CampagneServiceImpl(CampagneRepository campagneRepository) {
        this.campagneRepository = campagneRepository;
    }

    @Override
    public Campagne createCampagne(Campagne campagne) throws BadRequestException {
        if (campagne.getId() != null) {
            throw new BadRequestException("Impossible de créer une nouvelle campgne ayant un id non null.");
        }
        return campagneRepository.save(campagne);
    }
    @Override
    public Campagne updateCampagne(Long id, Campagne campagne) throws NotFoundException {
        if (campagne.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une nouvelle campagne ayant un id null.");
        }
        if (!campagneRepository.existsById(campagne.getId())) {
            throw new NotFoundException("Impossible de trouver la campagne spécifiée dans notre base de données.");
        }
        return campagneRepository.save(campagne);
    }

    @Override
    public void deleteCampagne(Long id) throws NotFoundException {
        Optional<Campagne> campagneOptional = campagneRepository.findById(id);
        if (campagneOptional.isPresent()) {
            campagneRepository.deleteById(campagneOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la campagne spécifiée dans notre base de données.");
        }
    }
    @Override
    public Page<Campagne> getCampagneList(Pageable pageable) {
        return campagneRepository.findAll(pageable);
    }

    @Override
    public List<Campagne> getCampagneList() {
        return campagneRepository.findAll();
    }

    @Override
    public List<Campagne> getCampagnesByType(TypeCampagne typeCampagne) {
        return campagneRepository.findAllByTypeCampagne(typeCampagne);
    }

    @Override
    public Optional<Campagne> getCampagneById(Long id) {
        return campagneRepository.findById(id);
    }
}

