/*
 * Copyright 2015-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.incubator.net.tunnel;

import com.google.common.annotations.Beta;
import org.onosproject.core.DefaultGroupId;
import org.onosproject.net.AbstractDescription;
import org.onosproject.net.Path;
import org.onosproject.net.SparseAnnotations;
import org.onosproject.net.provider.ProviderId;

import com.google.common.base.MoreObjects;

/**
 * Default implementation of immutable tunnel description entity.
 */
@Beta
public class DefaultTunnelDescription extends AbstractDescription
        implements TunnelDescription {

    private final TunnelId tunnelId;
    private final TunnelEndPoint src;
    private final TunnelEndPoint dst;
    private final Tunnel.Type type;
    private final DefaultGroupId groupId; // represent for a group flow table
    // which a tunnel match up
    // tunnel producer
    private final ProviderId producerName; // tunnel producer name
    private final TunnelName tunnelName; // name of a tunnel
    private final Path path;

    /**
     * Creates a tunnel description using the supplied information.
     *
     * @param id TunnelId
     * @param src TunnelPoint source
     * @param dst TunnelPoint destination
     * @param type tunnel type
     * @param groupId groupId
     * @param producerName tunnel producer
     * @param tunnelName tunnel name
     * @param path the path of tunnel
     * @param annotations optional key/value annotations
     */
    public DefaultTunnelDescription(TunnelId id, TunnelEndPoint src,
                                    TunnelEndPoint dst, Tunnel.Type type,
                                    DefaultGroupId groupId,
                                    ProviderId producerName,
                                    TunnelName tunnelName,
                                    Path path,
                                    SparseAnnotations... annotations) {
        super(annotations);
        this.tunnelId = id;
        this.src = src;
        this.dst = dst;
        this.type = type;
        this.groupId = groupId;
        this.producerName = producerName;
        this.tunnelName = tunnelName;
        this.path = path;
    }

    @Override
    public TunnelId id() {
        return tunnelId;
    }

    @Override
    public TunnelEndPoint src() {
        return src;
    }

    @Override
    public TunnelEndPoint dst() {
        return dst;
    }

    @Override
    public Tunnel.Type type() {
        return type;
    }

    @Override
    public DefaultGroupId groupId() {
        return groupId;
    }

    @Override
    public ProviderId producerName() {
        return producerName;
    }

    @Override
    public TunnelName tunnelName() {
        return tunnelName;
    }


    @Override
    public Path path() {
        return path;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("tunnelId", id())
                .add("src", src())
                .add("dst", dst())
                .add("type", type())
                .add("tunnelName", tunnelName())
                .add("producerName", producerName())
                .add("groupId", groupId())
                .add("path", path)
                .toString();
    }
}
