package de.accso.flexinale.infrastructure.security.mapper;

import de.accso.flexinale.domain.model.Besucher;
import de.accso.flexinale.infrastructure.security.BenutzerEntity;
import de.accso.flexinale.shared_kernel.Identifiable;

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

import static de.accso.flexinale.shared_kernel.RawWrapper.getRawOrNull;

@SuppressWarnings("unused")
public class BenutzerEntity2BesucherMapper {

    public static Besucher map(final BenutzerEntity benutzerEntity) {
        return new Besucher(Identifiable.Id.of(benutzerEntity.id), benutzerEntity.version(),
                new Besucher.Login(benutzerEntity.login), new Besucher.EmailAdresse(benutzerEntity.emailAdresse),
                new Besucher.Name(benutzerEntity.name), new Besucher.Vorname(benutzerEntity.vorname));
    }

    @SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "unused"})
    public static Optional<Besucher> map(final Optional<BenutzerEntity> optionalBenutzerEntity) {
        if (optionalBenutzerEntity.isEmpty()) {
            return Optional.empty();
        }
        else {
            BenutzerEntity benutzerEntity = optionalBenutzerEntity.get();
            return Optional.of(map(benutzerEntity));
        }
    }

    public static BenutzerEntity map(final Besucher besucher) {
        return new BenutzerEntity(besucher.id().id(), besucher.version().version(),
                getRawOrNull(besucher.login), getRawOrNull(besucher.emailAdresse),
                getRawOrNull(besucher.name), getRawOrNull(besucher.vorname));
    }

    public static List<Besucher> map(final List<BenutzerEntity> benutzerEntities) {
        return benutzerEntities.stream().map(BenutzerEntity2BesucherMapper::map)
                .collect(Collectors.toCollection(ArrayList::new));
    }
}
