package com.contentsquare.rn.eventEmitter;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.util.HashMap;
import java.util.Map;

public class CSEventEmitterModuleImpl extends ReactContextBaseJavaModule {
    public static final String NAME = "CSEventEmitterModule";

    private final ReactApplicationContext mReactContext;
    private final Map<String, Integer> listenerCounts = new HashMap<>();

    public CSEventEmitterModuleImpl(ReactApplicationContext reactContext) {
        super(reactContext);
        this.mReactContext = reactContext;

        // Init listener counts to 0
        for (CSEmitterEvents event : CSEmitterEvents.values()) {
            listenerCounts.put(event.getEvent(), 0);
        }
    }

    @Override
    public String getName() {
        return NAME;
    }

    @ReactMethod
    public void addListener(String eventName) {
        if (eventName != null && isEventSupported(eventName)) {
            int count = listenerCounts.getOrDefault(eventName, 0);
            listenerCounts.put(eventName, count + 1);
        }
    }

    @ReactMethod
    public void removeListeners(int count) {
        // No-op, RN will call our custom removeListener method instead
    }

    // Custom method to remove a single listener by event name
    @ReactMethod
    public void removeListener(String eventName) {
        if (isEventSupported(eventName)) {
            int count = listenerCounts.getOrDefault(eventName, 0);
            listenerCounts.put(eventName, Math.max(0, count - 1));
        }
    }

    public void sendSessionReplayLink(String url) {
        System.out.println("CSLIB sendSessionReplayLink: " + url);
        sendEvent(CSEmitterEvents.SESSION_REPLAY_LINK_CHANGE.getEvent(), url);
    }

    public boolean sendFeatureFlags(Object data) {
        return sendEvent(CSEmitterEvents.GET_FEATURE_FLAGS.getEvent(), data);
    }

    public boolean sendMetadataChange(Object data) {
        return sendEvent(CSEmitterEvents.ON_METADATA_CHANGE.getEvent(), data);
    }

    private boolean sendEvent(String eventName, Object data) {
        if (listenerCounts.getOrDefault(eventName, 0) > 0) {
            mReactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, data);
            return true;
        }
        return false;
    }

    private boolean isEventSupported(String event) {
        for (CSEmitterEvents e : CSEmitterEvents.values()) {
            if (e.getEvent().equals(event)) {
                return true;
            }
        }
        return false;
    }

    public enum CSEmitterEvents {
        SESSION_REPLAY_LINK_CHANGE("onSessionReplayLinkChange"),
        GET_FEATURE_FLAGS("getFeatureFlags"),
        ON_METADATA_CHANGE("onMetadataChange");

        private final String event;

        CSEmitterEvents(String event) {
            this.event = event;
        }

        public String getEvent() {
            return event;
        }
    }
}