package de.accso.flexinale.backoffice.api_out.event.mapper;

import de.accso.flexinale.backoffice.api_contract.event.model.KinoSaalTO;
import de.accso.flexinale.backoffice.api_contract.event.model.KinoTO;
import de.accso.flexinale.backoffice.domain.model.Kino;
import de.accso.flexinale.backoffice.domain.model.KinoSaal;

import java.util.HashSet;

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

public final class KinoKinoSaal2KinoKinoSaalTOMapper {

    public static KinoTO mapKino(final Kino kino) {
        final KinoTO mappedKino = new KinoTO(kino.id(), kino.version(),
                new KinoTO.Name(getRawOrNull(kino.name)),
                new KinoTO.Adresse(getRawOrNull(kino.adresse)),
                new KinoTO.EmailAdresse(getRawOrNull(kino.emailAdresse)),
                new HashSet<>());

        kino.kinoSaele.stream()
                .map(kinoSaal -> mapKinoSaal(kinoSaal, mappedKino))
                .forEach(kinoSaal -> mappedKino.kinoSaele().add(kinoSaal));

        return mappedKino;
    }

    static KinoSaalTO mapKinoSaal(final KinoSaal kinoSaal) {
        Kino kino = kinoSaal.kino;
        KinoTO mappedKino = mapKino(kino);
        return new KinoSaalTO(kinoSaal.id(), kino.version,
                new KinoSaalTO.Name(getRawOrNull(kinoSaal.name)),
                new KinoSaalTO.AnzahlPlaetze(getRawOrNull(kinoSaal.anzahlPlaetze)),
                mappedKino);
    }

    private static KinoSaalTO mapKinoSaal(final KinoSaal kinoSaal, final KinoTO kino) {
        return new KinoSaalTO(kinoSaal.id(), kinoSaal.version,
                new KinoSaalTO.Name(getRawOrNull(kinoSaal.name)),
                new KinoSaalTO.AnzahlPlaetze(getRawOrNull(kinoSaal.anzahlPlaetze)),
                kino);
    }
}
