package de.accso.flexinale.backoffice.infrastructure.persistence;

import de.accso.flexinale.backoffice.domain.dao.VorfuehrungDao;
import de.accso.flexinale.backoffice.domain.model.Vorfuehrung;
import de.accso.flexinale.backoffice.infrastructure.persistence.mapper.VorfuehrungEntity2VorfuehrungMapper;
import de.accso.flexinale.common.shared_kernel.Identifiable;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@SuppressWarnings("unused")
public class VorfuehrungJpaRepositoryDelegate implements VorfuehrungDao {

    private final VorfuehrungJpaRepository vorfuehrungJpaRepository;

    public VorfuehrungJpaRepositoryDelegate(final VorfuehrungJpaRepository vorfuehrungJpaRepository) {
        this.vorfuehrungJpaRepository = vorfuehrungJpaRepository;
    }

    @Override
    public List<Vorfuehrung> findAll() {
        List<VorfuehrungEntity> vorfuehrungEntities = vorfuehrungJpaRepository.findAll();

        return vorfuehrungEntities.stream()
                .map(VorfuehrungEntity2VorfuehrungMapper::map)
                .collect(Collectors.toCollection(ArrayList::new));
    }

    @Override
    public Optional<Vorfuehrung> findById(final Identifiable.Id id) {
        Optional<VorfuehrungEntity> vorfuehrungEntity = vorfuehrungJpaRepository.findById(id.id());
        return VorfuehrungEntity2VorfuehrungMapper.map(vorfuehrungEntity);
    }

    @Override
    public List<Vorfuehrung> findByFilmId(final Identifiable.Id filmId) {
        List<VorfuehrungEntity> vorfuehrungEntities = vorfuehrungJpaRepository.findByFilmId(filmId.id());
        return VorfuehrungEntity2VorfuehrungMapper.map(vorfuehrungEntities);
    }

    @Override
    public Vorfuehrung save(final Vorfuehrung vorfuehrung) {
        VorfuehrungEntity vorfuehrungEntity = VorfuehrungEntity2VorfuehrungMapper.map(vorfuehrung);
        VorfuehrungEntity savedEntity = vorfuehrungJpaRepository.save(vorfuehrungEntity);
        return VorfuehrungEntity2VorfuehrungMapper.map(savedEntity);
    }

    @Override
    public void delete(final Vorfuehrung vorfuehrung) {
        VorfuehrungEntity vorfuehrungEntity = VorfuehrungEntity2VorfuehrungMapper.map(vorfuehrung);
        vorfuehrungJpaRepository.delete(vorfuehrungEntity);
    }

    @Override
    public void deleteById(final Identifiable.Id id) {
        vorfuehrungJpaRepository.deleteById(id.id());
    }

    @Override
    public void deleteAll() {
        vorfuehrungJpaRepository.deleteAll();
    }
}
