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

import de.accso.flexinale.domain.model.Besucher;
import de.accso.flexinale.domain.model.Film;
import de.accso.flexinale.domain.model.Ticket;
import de.accso.flexinale.domain.model.Vorfuehrung;
import de.accso.flexinale.infrastructure.persistence.FilmEntity;
import de.accso.flexinale.infrastructure.persistence.TicketEntity;
import de.accso.flexinale.infrastructure.persistence.VorfuehrungEntity;
import de.accso.flexinale.infrastructure.security.BenutzerEntity;
import de.accso.flexinale.infrastructure.security.mapper.BenutzerEntity2BesucherMapper;

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

public final class TicketEntity2TicketMapper {

    public static Ticket map(final TicketEntity ticketEntity) {
        Film mappedFilm = FilmEntity2FilmMapper.map(ticketEntity.film);
        Vorfuehrung mappedVorfuehrung = VorfuehrungEntity2VorfuehrungMapper.map(ticketEntity.vorfuehrung);
        Besucher mappedBesucher = BenutzerEntity2BesucherMapper.map(ticketEntity.benutzer);

        return new Ticket(ticketEntity.id(), ticketEntity.version(),
                mappedFilm, mappedVorfuehrung, mappedBesucher,
                ticketEntity.verkaufsKanal);
    }

    @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
    public static Optional<Ticket> map(final Optional<TicketEntity> optionalTicketEntity) {
        if (optionalTicketEntity.isEmpty()) {
            return Optional.empty();
        }
        else {
            TicketEntity ticketEntity = optionalTicketEntity.get();
            return Optional.of(map(ticketEntity));
        }
    }

    public static TicketEntity map(final Ticket ticket) {
        FilmEntity mappedFilm = FilmEntity2FilmMapper.map(ticket.film);
        VorfuehrungEntity mappedVorfuehrung = VorfuehrungEntity2VorfuehrungMapper.map(ticket.vorfuehrung);
        BenutzerEntity mappedBenutzer = BenutzerEntity2BesucherMapper.map(ticket.besucher);

        return new TicketEntity(ticket.id().id(), ticket.version().version(),
                mappedFilm, mappedVorfuehrung, mappedBenutzer,
                ticket.verkaufsKanal);
    }

    public static List<Ticket> map(final List<TicketEntity> ticketEntities) {
        return ticketEntities.stream().map(TicketEntity2TicketMapper::map)
                .collect(Collectors.toCollection(ArrayList::new));
    }
}
