/*
 * Copyright 2014 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.onlab.onos.net.intent;

import java.util.Collection;

import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.onlab.onos.net.Link;

/**
 * Matcher to determine if a Collection of Links contains a path between a source
 * and a destination.
 */
public class LinksHaveEntryWithSourceDestinationPairMatcher extends
        TypeSafeMatcher<Collection<Link>> {
    private final String source;
    private final String destination;

    /**
     * Creates a matcher for a given path represented by a source and
     * a destination.
     *
     * @param source string identifier for the source of the path
     * @param destination string identifier for the destination of the path
     */
    LinksHaveEntryWithSourceDestinationPairMatcher(String source,
                                                   String destination) {
        this.source = source;
        this.destination = destination;
    }

    @Override
    public boolean matchesSafely(Collection<Link> links) {
        for (Link link : links) {
            if (link.src().elementId().toString().endsWith(source) &&
                    link.dst().elementId().toString().endsWith(destination)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("link lookup for source \"");
        description.appendText(source);
        description.appendText(" and destination ");
        description.appendText(destination);
        description.appendText("\"");
    }

    @Override
    public void describeMismatchSafely(Collection<Link> links,
                                       Description mismatchDescription) {
        mismatchDescription.appendText("was ").
                appendText(links.toString());
    }

    /**
     * Creates a link has path matcher.
     *
     * @param source string identifier for the source of the path
     * @param destination string identifier for the destination of the path
     * @return matcher to match the path
     */
    public static LinksHaveEntryWithSourceDestinationPairMatcher linksHasPath(
            String source,
            String destination) {
        return new LinksHaveEntryWithSourceDestinationPairMatcher(source,
                destination);
    }
}

