/**
 * Copyright 2016-present Open Networking Laboratory
 * 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 org.onosproject.kafkaintegration.api.dto;

import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Objects;

import org.onosproject.kafkaintegration.api.dto.OnosEvent.Type;

/**
 * Representation of a subscription to an event type.
 *
 */
public final class DefaultEventSubscriber implements EventSubscriber {
    private final String appName;
    private final EventSubscriberGroupId subscriberGroupId;
    private final Type eventType;

    /**
     * Creates a new Event Subscriber.
     *
     * @param name Application Name
     * @param groupId Subscriber group id of the application
     * @param eventType ONOS event type
     */
    public DefaultEventSubscriber(String name, EventSubscriberGroupId groupId,
                                  Type eventType) {
        this.appName = checkNotNull(name);
        this.subscriberGroupId = checkNotNull(groupId);
        this.eventType = checkNotNull(eventType);
    }

    @Override
    public String appName() {
        return appName;
    }

    @Override
    public EventSubscriberGroupId subscriberGroupId() {
        return subscriberGroupId;
    }

    @Override
    public Type eventType() {
        return eventType;
    }

    @Override
    public int hashCode() {
        return Objects.hash(appName, subscriberGroupId, eventType);
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof DefaultEventSubscriber) {
            DefaultEventSubscriber sub = (DefaultEventSubscriber) o;
            if (sub.appName.equals(appName)
                    && sub.subscriberGroupId.equals(subscriberGroupId)
                    && sub.eventType.equals(eventType)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public String toString() {
        return toStringHelper(this).add("appName", appName)
                .addValue(subscriberGroupId.toString())
                .add("eventType", eventType).toString();
    }
    /**
     * To create an instance of the builder.
     *
     * @return instance of builder
     */
    public static Builder builder() {
        return new Builder();
    }
    /**
     * Builder class for Event subscriber.
     */
    public static final class Builder implements EventSubscriber.Builder {
        private String appName;
        private EventSubscriberGroupId subscriberGroupId;
        private Type eventType;

        @Override
        public Builder setAppName(String appName) {
            this.appName = appName;
            return this;
        }

        @Override
        public Builder setSubscriberGroupId(EventSubscriberGroupId
                                                            subscriberGroupId) {
            this.subscriberGroupId = subscriberGroupId;
            return this;
        }

        @Override
        public Builder setEventType(Type eventType) {
            this.eventType = eventType;
            return this;
        }

        @Override
        public EventSubscriber build() {
            checkNotNull(appName, "App name cannot be null");
            checkNotNull(subscriberGroupId, "Subscriber group ID cannot " +
                    "be " +
                    "null");
            checkNotNull(eventType, "Event type cannot be null");

            return new DefaultEventSubscriber(appName,
                                              subscriberGroupId,
                                              eventType);
        }
    }

}
