/*
 * Copyright 2014-present Open Networking Foundation
 *
 * 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.net.intent;

import java.util.Collection;

import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.onosproject.net.EdgeLink;
import org.onosproject.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 (source.equals(destination) && link instanceof EdgeLink) {
                EdgeLink edgeLink = (EdgeLink) link;
                if (edgeLink.hostLocation().elementId()
                        .toString().endsWith(source)) {
                    return true;
                }
            }

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

