package de.accso.flexinale.besucherportal.api_out.event;

import de.accso.flexinale.besucherportal.api_contract.event.GutscheinEinloesenBeauftragtEvent;
import de.accso.flexinale.besucherportal.api_contract.event.model.GutscheinEinloesenAuftragTO;
import de.accso.flexinale.besucherportal.application.services.GutscheinEinloesenBeauftragtPublication;
import de.accso.flexinale.common.api.eventbus.EventBus;
import de.accso.flexinale.common.api.eventbus.EventBusFactory;
import de.accso.flexinale.common.api.eventbus.EventNotification;
import de.accso.flexinale.common.api.eventbus.EventPublisher;
import de.accso.flexinale.common.shared_kernel.Identifiable;
import de.accso.flexinale.common.shared_kernel.Versionable;

public class GutscheinEinloesenBeauftragtPublisher implements EventPublisher<GutscheinEinloesenBeauftragtEvent>, GutscheinEinloesenBeauftragtPublication {
    private final EventBus<GutscheinEinloesenBeauftragtEvent> gutscheinEinloesenBeauftragtEventBus;
    private final EventNotification notification;

    public GutscheinEinloesenBeauftragtPublisher(final EventBusFactory eventBusFactory,
                                                 final EventNotification notification) {
        this.gutscheinEinloesenBeauftragtEventBus = eventBusFactory.createOrGetEventBusFor(GutscheinEinloesenBeauftragtEvent.class);
        this.notification = notification;
    }

    @Override
    public void publishGutscheinEinloesenBeauftragtEvent(final Identifiable.Id vorfuehrungId,
                                                         final Identifiable.Id filmId,
                                                         final Identifiable.Id besucherId,
                                                         final int anzahlGutscheine) {
        GutscheinEinloesenAuftragTO gutschein = new GutscheinEinloesenAuftragTO(Identifiable.Id.of(), Versionable.initialVersion(),
                filmId, vorfuehrungId, besucherId,
                new GutscheinEinloesenAuftragTO.AnzahlTickets(anzahlGutscheine));

        post(GutscheinEinloesenBeauftragtEvent.class,
                new GutscheinEinloesenBeauftragtEvent(gutschein));
    }

    @Override
    public String getName() {
        return GutscheinEinloesenBeauftragtPublisher.class.getName();
    }

    @Override
    public void post(Class<GutscheinEinloesenBeauftragtEvent> eventType, GutscheinEinloesenBeauftragtEvent event) {
        this.gutscheinEinloesenBeauftragtEventBus.publish(eventType, event);
        this.notification.notify(event);
    }
}
