/*
 * 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.ui.model.topo;

import org.onosproject.net.region.RegionId;

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

/**
 * A synthetic link that encapsulates a UiLink instance and the region to
 * which it belongs.
 */
public class UiSynthLink {

    private final RegionId regionId;
    private final UiLink link;
    private final UiLink original;

    /**
     * Constructs a synthetic link with the given parameters.
     *
     * @param regionId the region to which the link belongs
     * @param link     the link instance
     * @param original the original link (device or edge)
     *                 from which this was derived
     */
    public UiSynthLink(RegionId regionId, UiLink link, UiLink original) {
        this.regionId = regionId;
        this.link = link;
        this.original = original;
    }

    @Override
    public String toString() {
        return toStringHelper(this)
                .add("region", regionId)
                .add("link", link)
                .add("original", original)
                .toString();
    }

    /**
     * Returns the region identifier.
     *
     * @return the region ID
     */
    public RegionId regionId() {
        return regionId;
    }

    /**
     * Returns the link.
     *
     * @return the link
     */
    public UiLink link() {
        return link;
    }

    /**
     * Returns the original link from which this was derived.
     *
     * @return the original link
     */
    public UiLink original() {
        return original;
    }
}
