package de.accso.flexinale.shared_code_for_test;

import de.accso.flexinale.data.model.*;

import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;

import static de.accso.flexinale.shared_kernel.Identifiable.Id.uuidString;

public final class TestDataBuilder {

    public static Film createFilm() {
        return createFilm("testfilm", "testurl", 42);
    }

    public static Film createFilm(final String titel, final String imdbUrl, final Integer dauerInMinuten) {
        return new Film(uuidString(), titel, imdbUrl, dauerInMinuten);
    }

    public static Kino createKinoWithKinosaele() {
        return createKinoWithKinosaele(120, 111, 112);
    }

    public static Kino createKinoWithKinosaele(int... anzahlPlaetze) {
        Kino kino = new Kino(uuidString(), "Helion", "Kinostrasse 1",
                "contact.helion@fl.ex", new HashSet<>());

        Set<KinoSaal> saele = new HashSet<>();
        int counter = 1;
        for (int anzahl : anzahlPlaetze) {
            saele.add(new KinoSaal(uuidString(), "saal " + counter, anzahl, kino));
        }
        kino.addSaele(saele);

        return kino;
    }

    public static Benutzer createBenutzer() {
        String benutzerId = uuidString();
        return new Benutzer(uuidString(),
                "testlogin" + benutzerId, // needs to be unique
                "test" + benutzerId + "@fl.ex",   // needs to be unique
                "testname", "testvorname",
                Benutzer.Rolle.ROLE_BESUCHER);
    }

    public static Vorfuehrung createVorfuehrung(LocalDateTime zeit, Film film, KinoSaal kinoSaal) {
        return createVorfuehrung(zeit, film, kinoSaal, 33); // one third
    }

    public static Vorfuehrung createVorfuehrung(LocalDateTime zeit, Film film, KinoSaal kinoSaal, int quoteOnline) {
        return new Vorfuehrung(uuidString(), zeit, film, kinoSaal, quoteOnline);
    }

    public static Ticket createTicket(Film film, Vorfuehrung vorfuehrung, Benutzer besucher) {
        return createTicket(film, vorfuehrung, besucher, Ticket.VerkaufsKanal.ONLINE);
    }

    public static Ticket createTicket(Film film, Vorfuehrung vorfuehrung, Benutzer besucher, Ticket.VerkaufsKanal kanal) {
        return new Ticket(uuidString(), film, vorfuehrung, besucher, kanal);
    }

    public static Kontingent createKontingent(int gesamtKapazitaetVerkauf, int quoteOnline) {
        return new Kontingent(uuidString(), gesamtKapazitaetVerkauf, quoteOnline);
    }
}
