package de.accso.flexinale.domain.services;

import de.accso.flexinale.domain.dao.FilmDao;
import de.accso.flexinale.domain.dao.TicketDao;
import de.accso.flexinale.domain.dao.VorfuehrungDao;
import de.accso.flexinale.domain.model.Besucher;
import de.accso.flexinale.domain.model.Film;
import de.accso.flexinale.domain.model.Vorfuehrung;
import de.accso.flexinale.shared_kernel.Identifiable;

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

public class FilmService {

    private final FilmDao filmDao;

    private final VorfuehrungDao vorfuehrungDao;

    private final TicketDao ticketDao;

    private final long minZeitZwischenVorfuehrungenInMinuten;

    public FilmService(final FilmDao filmDao, final VorfuehrungDao vorfuehrungDao, final TicketDao ticketDao,
                       final long minZeitZwischenVorfuehrungenInMinuten) {
        this.filmDao = filmDao;
        this.vorfuehrungDao = vorfuehrungDao;
        this.ticketDao = ticketDao;
        this.minZeitZwischenVorfuehrungenInMinuten = minZeitZwischenVorfuehrungenInMinuten;
    }

    public List<Film> filme() {
        return filmDao.findAll();
    }

    public Film film(Identifiable.Id id) {
        return filmDao.findById(id).orElse(null);
    }

    public List<Vorfuehrung> vorfuehrungenFuer(final Identifiable.Id filmId) {
        return vorfuehrungDao.findByFilmId(filmId);
    }

    public List<Identifiable.Id> vorfuehrungenMitUeberlapp(final List<Vorfuehrung> vorfuehrungen, final Besucher besucher) {
        List<Identifiable.Id> vorfuehrungenMitUeberlapp = new ArrayList<>();

        TicketBundle ticketBundle = new TicketBundle(besucher, ticketDao, minZeitZwischenVorfuehrungenInMinuten);

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

    public List<Identifiable.Id> vorfuehrungenFuerDieDerBenutzerEinTicketHat(final List<Vorfuehrung> vorfuehrungen, final Besucher besucher) {
        List<Identifiable.Id> vorfuehrungenMitTicket = new ArrayList<>();

        TicketBundle ticketBundle = new TicketBundle(besucher, ticketDao, minZeitZwischenVorfuehrungenInMinuten);

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