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

import de.accso.flexinale.backoffice_api_contract.api_contract.FilmRetriever;
import de.accso.flexinale.backoffice_api_contract.api_contract.VorfuehrungRetriever;
import de.accso.flexinale.backoffice_api_contract.api_contract.model.FilmTO;
import de.accso.flexinale.backoffice_api_contract.api_contract.model.VorfuehrungTO;
import de.accso.flexinale.common.shared_kernel.Identifiable;
import de.accso.flexinale.ticketing_api_contract.api_contract.TicketRetriever;

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

public class FilmService {

    private final FilmRetriever filmRetriever;

    private final VorfuehrungRetriever vorfuehrungRetriever;

    private final TicketRetriever ticketRetriever;

    private final VorfuehrungService vorfuehrungService;

    private final long minZeitZwischenVorfuehrungenInMinuten;

    public FilmService(final FilmRetriever filmRetriever, final VorfuehrungRetriever vorfuehrungRetriever,
                       final TicketRetriever ticketRetriever,
                       final VorfuehrungService vorfuehrungService,
                       long minZeitZwischenVorfuehrungenInMinuten) {
        this.filmRetriever = filmRetriever;
        this.vorfuehrungRetriever = vorfuehrungRetriever;
        this.ticketRetriever = ticketRetriever;
        this.vorfuehrungService = vorfuehrungService;
        this.minZeitZwischenVorfuehrungenInMinuten = minZeitZwischenVorfuehrungenInMinuten;
    }

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

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

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

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

        TicketBundle ticketBundle = new TicketBundle(besucherId,
                ticketRetriever, vorfuehrungRetriever, vorfuehrungService,
                minZeitZwischenVorfuehrungenInMinuten);

        for (VorfuehrungTO vorfuehrung : vorfuehrungen) {
            if (ticketBundle.mindestensEinTicketImTicketBundleUeberlapptMit(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,
                ticketRetriever, vorfuehrungRetriever, vorfuehrungService,
                minZeitZwischenVorfuehrungenInMinuten);

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