package de.accso.flexinale.besucherportal.application.services;

import de.accso.flexinale.backoffice.api_contract.event.model.FilmTO;
import de.accso.flexinale.backoffice.api_contract.event.model.VorfuehrungTO;
import de.accso.flexinale.common.shared_kernel.Identifiable;

import java.util.ArrayList;
import java.util.List;

public class FilmService {

    private final FKKsVTInMemoryCache cache;

    private final VorfuehrungService vorfuehrungService;

    private final long minZeitZwischenVorfuehrungenInMinuten;

    public FilmService(final FKKsVTInMemoryCache cache,
                       final VorfuehrungService vorfuehrungService,
                       final long minZeitZwischenVorfuehrungenInMinuten) {
        this.cache = cache;
        this.vorfuehrungService = vorfuehrungService;
        this.minZeitZwischenVorfuehrungenInMinuten = minZeitZwischenVorfuehrungenInMinuten;
    }

    public List<FilmTO> filme() {
        return cache.filme();
    }

    public FilmTO film(final Identifiable.Id id) {
        return cache.film(id);
    }

    public List<VorfuehrungTO> vorfuehrungenFuer(final Identifiable.Id filmId) {
        return cache.vorfuehrungenByFilmId(filmId);
    }

    public List<String> vorfuehrungenMitUeberlapp(final List<VorfuehrungTO> vorfuehrungen,
                                                  final Identifiable.Id besucherId) {
        List<String> vorfuehrungenMitUeberlapp = new ArrayList<>();

        TicketBundle ticketBundle = new TicketBundle(besucherId, cache, vorfuehrungService, minZeitZwischenVorfuehrungenInMinuten);

        for (VorfuehrungTO vorfuehrung : vorfuehrungen) {
            if (ticketBundle.mindestensEinGueltigesTicketImTicketBundleUeberlapptMit(vorfuehrung)) {
                vorfuehrungenMitUeberlapp.add(vorfuehrung.id().id());
            }
        }
        return vorfuehrungenMitUeberlapp;
    }

    public List<String> vorfuehrungenFuerDieDerBenutzerEinTicketHat(final List<VorfuehrungTO> vorfuehrungen,
                                                                    final Identifiable.Id besucherId) {
        List<String> vorfuehrungenMitTicket = new ArrayList<>();

        TicketBundle ticketBundle = new TicketBundle(besucherId, cache, vorfuehrungService, minZeitZwischenVorfuehrungenInMinuten);

        for (VorfuehrungTO vorfuehrung : vorfuehrungen) {
            if (ticketBundle.hatSchonGueltigesTicketFuer(vorfuehrung)) {
                vorfuehrungenMitTicket.add(vorfuehrung.id().id());
            }
        }
        return vorfuehrungenMitTicket;
    }
}
