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

import org.onosproject.net.provider.ProviderId;

import java.util.List;
import java.util.Objects;
import static com.google.common.collect.ImmutableSet.of;

/**
 * Default implementation of a network disjoint path pair.
 */
public class DefaultDisjointPath extends DefaultPath implements DisjointPath {

    private final DefaultPath path1;
    private final DefaultPath path2;

    boolean usingPath1 = true;

    /**
     * Creates a disjoint path pair from two default paths.
     *
     * @param providerId provider identity
     * @param path1      primary path
     * @param path2      backup path
     */
    public DefaultDisjointPath(ProviderId providerId, DefaultPath path1, DefaultPath path2) {
        super(providerId, path1.links(), path1.cost() + path2.cost());
        this.path1 = path1;
        this.path2 = path2;
    }

    @Override
    public List<Link> links() {
        if (usingPath1) {
            return path1.links();
        } else {
            return path2.links();
        }
    }

    @Override
    public double cost() {
        if (usingPath1) {
            return path1.cost();
        }
        return path2.cost();
    }

    @Override
    public Path primary() {
        return path1;
    }

    @Override
    public Path backup() {
        return path2;
    }

    @Override
    public int hashCode() {
        return Objects.hash(of(path1, path2), src(), dst());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof DefaultDisjointPath) {
            final DefaultDisjointPath other = (DefaultDisjointPath) obj;
            return Objects.equals(this.path1, other.path1) && Objects.equals(this.path2, other.path2);
        }
        return false;
    }

    @Override
    public boolean useBackup() {
        if (path2 == null || path2.links() == null) {
            return false;
        }
        usingPath1 = !usingPath1;
        return true;
    }
}
