package de.accso.flexinale.application;

import de.accso.flexinale.data.model.Benutzer;
import de.accso.flexinale.data.model.Ticket;
import de.accso.flexinale.data.model.Ticket.VerkaufsKanal;
import de.accso.flexinale.data.model.Vorfuehrung;
import de.accso.flexinale.data.persistence.TicketDao;
import de.accso.flexinale.data.persistence.VorfuehrungDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

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

@Component
@SuppressWarnings("unused")
public class TicketService {

    private static final Logger LOGGER = LoggerFactory.getLogger(TicketService.class);

    @Autowired
    TicketDao ticketDao;

    @Autowired
    VorfuehrungDao vorfuehrungDao;

    public void loeseGutscheineOnlineFuerVorfuehrungEin(final String vorfuehrungId, final Benutzer benutzer, final int anzahlGutscheine) {
        loeseGutscheineFuerVorfuehrungEin(vorfuehrungId, benutzer, anzahlGutscheine, VerkaufsKanal.ONLINE);
    }

    @SuppressWarnings("SameParameterValue")
    private void loeseGutscheineFuerVorfuehrungEin(final String vorfuehrungId, final Benutzer benutzer,
                                                   final int anzahlGutscheine, final VerkaufsKanal verkaufsKanal) {
        Vorfuehrung vorfuehrung = vorfuehrungDao.findById(vorfuehrungId).get(); //TODO check isPresent() first!
        vorfuehrung.verkaufeTickets(verkaufsKanal, anzahlGutscheine);

        for (int i = 0; i < anzahlGutscheine; i++) {
            Ticket ticket = new Ticket(uuidString(), vorfuehrung.film, vorfuehrung, benutzer, verkaufsKanal);
            ticketDao.save(ticket);
        }

        LOGGER.info("%d ticket(s) bought for Vorfuehrung %s, Besucher %s, using Verkaufskanal %s"
                .formatted(anzahlGutscheine, vorfuehrung.id, benutzer.login, verkaufsKanal));
    }

    public int gesamtZahlDerTicketsFuer(final Benutzer loggedInBenutzer) {
        return ticketDao.gesamtZahlDerTicketsFuer(loggedInBenutzer);
    }

    public List<Ticket> findByBesucherOrderByZeit(final Benutzer eingeloggterBesucher) {
        return ticketDao.findByBenutzerOrderByZeit(eingeloggterBesucher);
    }
}
