package dev.alangomes.springspigot.reactive;

import dev.alangomes.springspigot.context.Context;
import dev.alangomes.springspigot.event.EventUtil;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.experimental.FieldDefaults;
import lombok.val;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;

@AllArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
class EventEmitter<T extends Event> implements ObservableOnSubscribe<T> {

    @Getter
    Listener listener = new Listener() {
    };

    Class<? extends Event> eventClazz;

    ObserveEvent observeEvent;

    Plugin plugin;

    Context context;

    @Override
    public void subscribe(ObservableEmitter<T> observableEmitter) {
        val pluginManager = plugin.getServer().getPluginManager();
        pluginManager.registerEvent(eventClazz, listener, observeEvent.priority(), (l, event) -> {
            if (eventClazz.isAssignableFrom(event.getClass())) {
                T emittedEvent = (T) event;
                context.runWithSender(EventUtil.getSender(emittedEvent), () -> observableEmitter.onNext(emittedEvent));
            }
        }, plugin, observeEvent.ignoreCancelled());
    }
}