{{>licenseInfo}}

package {{{package}}};

import androidx.annotation.NonNull;

import com.walmartlabs.electrode.reactnative.bridge.ElectrodeBridgeEvent;
import com.walmartlabs.electrode.reactnative.bridge.ElectrodeBridgeEventListener;
import com.walmartlabs.electrode.reactnative.bridge.ElectrodeBridgeHolder;
import com.walmartlabs.electrode.reactnative.bridge.EventListenerProcessor;
import com.walmartlabs.electrode.reactnative.bridge.EventProcessor;
import com.walmartlabs.electrode.reactnative.bridge.None;

import java.util.*;
import java.util.UUID;

{{#imports}}
import {{import}};
{{#last}}

{{/last}}
{{/imports}}
final class {{{eventsImplClassName}}} implements {{{classname}}}.Events {
    {{{eventsImplClassName}}}() {
    }
{{#operations}}
{{#operation}}
{{#isEvent}}

    @Override
    public UUID add{{{camelizedNickName}}}EventListener(
            @NonNull final ElectrodeBridgeEventListener<{{#requestParam}}{{{dataType}}}{{/requestParam}}> eventListener) {
        return new EventListenerProcessor<>(EVENT_{{{nickNameConstant}}}, {{#requestParam}}{{#isList}}(Class) {{{baseType}}}.class{{/isList}}{{^isList}}{{{dataType}}}.class{{/isList}}{{/requestParam}}, eventListener).execute();
    }
{{/isEvent}}
{{/operation}}
{{/operations}}
{{#operations}}
{{#operation}}
{{#isEvent}}

    @Override
    public ElectrodeBridgeEventListener<ElectrodeBridgeEvent> remove{{{camelizedNickName}}}EventListener(
            @NonNull final UUID uuid) {
        return ElectrodeBridgeHolder.removeEventListener(uuid);
    }
{{/isEvent}}
{{/operation}}
{{/operations}}
{{#operations}}
{{#operation}}
{{#isEvent}}

    @Override
    public void emit{{{camelizedNickName}}}({{#hasRequestParam}}{{#requestParam}}{{{dataType}}} {{{paramName}}}{{/requestParam}}{{/hasRequestParam}}) {
        new EventProcessor<>(EVENT_{{{nickNameConstant}}}{{#hasRequestParam}}, {{#requestParam}}{{{paramName}}}{{/requestParam}}{{/hasRequestParam}}{{^hasRequestParam}}, null{{/hasRequestParam}}).execute();
    }
{{/isEvent}}
{{/operation}}
{{/operations}}
}
