/*
 * 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);
        }
    }

}
