/*
 * Copyright 2021-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.kubevirtnetworking.api;

import org.onlab.packet.IpAddress;

import java.util.Map;
import java.util.Set;

/**
 * Representation of virtual router.
 */
public interface KubevirtRouter {

    /**
     * Returns the router name.
     *
     * @return router name
     */
    String name();

    /**
     * Returns the router description.
     *
     * @return router description
     */
    String description();

    /**
     * Returns the SNAT enable flag.
     *
     * @return true if the router support SNAT, false otherwise
     */
    boolean enableSnat();

    /**
     * Returns a set of internal networks.
     *
     * @return a set of internal networks
     */
    Set<String> internal();

    /**
     * Returns external network along with external router IP address.
     * We use IP address as the key, and external network name as the value.
     *
     * @return external network paired with external router IP address
     */
    Map<IpAddress, String> external();

    /**
     * Returns external peer router.
     *
     * @return peer router
     */
    KubevirtPeerRouter peerRouter();

    interface Builder {

        /**
         * Builds an immutable network instance.
         *
         * @return kubevirt router
         */
        KubevirtRouter build();

        /**
         * Returns kubevirt router builder with supplied router name.
         *
         * @param name router name
         * @return router builder
         */
        Builder name(String name);

        /**
         * Returns kubevirt router builder with supplied router description.
         *
         * @param description router description
         * @return router builder
         */
        Builder description(String description);

        /**
         * Returns kubevirt router builder with supplied enable SNAT flag.
         *
         * @param flag router flag
         * @return router builder
         */
        Builder enableSnat(boolean flag);

        /**
         * Returns kubevirt router builder with supplied internal networks.
         *
         * @param internal internal network set
         * @return router builder
         */
        Builder internal(Set<String> internal);

        /**
         * Returns kubevirt router builder with supplied external network with IP.
         *
         * @param external external network with IP
         * @return router builder
         */
        Builder external(Map<IpAddress, String> external);

        /**
         * Returns kubevirt router builder with supplied peer router.
         *
         * @param router peer router
         * @return router builder
         */
        Builder peerRouter(KubevirtPeerRouter router);
    }
}
