/*
 * 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 java.util.UUID;

/**
 * Wrapper Object for storing the consumer group id. Group ids are used by
 * external applications when consuming events from Kafka server.
 *
 */
public final class EventSubscriberGroupId {
    private final UUID id;

    /**
     * Creates a new Subscriber Group Id.
     *
     * @param uuid representing the group id.
     */
    public EventSubscriberGroupId(UUID uuid) {
        id = checkNotNull(uuid);
    }

    /**
     * Returns the Group Id of the subscriber.
     *
     * @return uuid representing the group id.
     */
    public UUID getId() {
        return id;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof EventSubscriberGroupId) {
            EventSubscriberGroupId sub = (EventSubscriberGroupId) o;
            if (sub.id.equals(id)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return toStringHelper(this).add("subscriberGroupId", id).toString();
    }
}
