/*
* Copyright 2017 WalmartLabs
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package {{{package}}};

import android.support.annotation.NonNull;

import com.walmartlabs.electrode.reactnative.bridge.ElectrodeBridgeEventListener;
import com.walmartlabs.electrode.reactnative.bridge.ElectrodeBridgeEvent;
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}};
{{/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}}
}
