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

import de.accso.flexinale.common.shared_kernel.Identifiable;
import de.accso.flexinale.ticketing.domain.dao.TicketDao;
import de.accso.flexinale.ticketing.domain.model.Ticket;
import de.accso.flexinale.ticketing_api_contract.api_contract.TicketRetriever;
import de.accso.flexinale.ticketing_api_contract.api_contract.model.TicketTO;
import jakarta.transaction.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Transactional
public class TicketRetrieverService implements TicketRetriever {

    private final TicketDao ticketDao;

    public TicketRetrieverService(final TicketDao ticketDao) {
        this.ticketDao = ticketDao;
    }

    @Override
    public List<TicketTO> ticketsByBesucherOrderByZeit(final Identifiable.Id besucherId) {
        List<Ticket> tickets = ticketDao.findByBesucherOrderByZeit(besucherId);
        return tickets.stream()
                .map(this::map)
                .collect(Collectors.toCollection(ArrayList::new));
    }

    @Override
    public int gesamtZahlDerTicketsFuer(final Identifiable.Id besucherId) {
        return ticketDao.gesamtZahlDerTicketsFuer(besucherId);
    }

    private TicketTO map(final Ticket ticket) {
        TicketTO.VerkaufsKanal verkaufsKanal =  switch (ticket.verkaufsKanal) {
              case ONLINE -> TicketTO.VerkaufsKanal.ONLINE;
              case ZENTRAL -> TicketTO.VerkaufsKanal.ZENTRAL;
              case KINOKASSE -> TicketTO.VerkaufsKanal.KINOKASSE;
          };

        return  new TicketTO(ticket.id(), ticket.version(), ticket.filmId, ticket.vorfuehrungId,
                ticket.besucherId, verkaufsKanal);
    }
}
