/*
 * 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.provider.nil;

import static com.google.common.base.Preconditions.checkArgument;

/**
 * Re-routable linear topology simulator with an alternate path in the middle.
 */
public class RerouteTopologySimulator extends LinearTopologySimulator {

    @Override
    protected void processTopoShape(String shape) {
        super.processTopoShape(shape);
        infrastructurePorts = 5;
        deviceCount = (topoShape.length == 1) ? deviceCount : Integer.parseInt(topoShape[1]);
    }

    @Override
    public void setUpTopology() {
        checkArgument(deviceCount > 2, "There must be at least 3 devices");
        super.setUpTopology();
    }

    @Override
    protected void createLinks() {
        int portOffset = 1;
        for (int i = 0, n = deviceCount - 2; i < n; i++) {
            createLink(i, i + 1, portOffset, 1);
            portOffset = 2;
        }
        int middle = (deviceCount - 1) / 2;
        int alternate = deviceCount - 1;
        createLink(middle - 1, alternate, 3, 1);
        createLink(middle, alternate, 3, 2);
    }

    @Override
    protected void createHosts() {
        createHosts(deviceIds.get(0), infrastructurePorts);
        createHosts(deviceIds.get(deviceCount - 2), infrastructurePorts);
    }

}
