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

import org.onlab.packet.IpAddress;
import org.onlab.packet.IpAddress.Version;
import org.onlab.packet.IpPrefix;

/**
 * Representation of a subnet.
 */
public interface Subnet {

    /**
     * Coarse classification of the type of the ipV6Mode.
     */
    enum Mode {
        DHCPV6_STATEFUL, DHCPV6_STATELESS, SLAAC
    }

    /**
     * Returns the subnet identifier.
     *
     * @return identifier
     */
    SubnetId id();

    /**
     * Returns the name of the subnet.
     *
     * @return subnetName
     */
    String subnetName();

    /**
     * Returns the network identifier.
     *
     * @return the network identifier
     */
    TenantNetworkId networkId();

    /**
     * Returns tenant identifier.
     *
     * @return the tenant identifier
     */
    TenantId tenantId();

    /**
     * Returns the IP version, which is 4 or 6.
     *
     * @return ipVersion
     */
    Version ipVersion();

    /**
     * Returns the cidr.
     *
     * @return cidr
     */
    IpPrefix cidr();

    /**
     * Returns the gateway IP address.
     *
     * @return gatewayIp
     */
    IpAddress gatewayIp();

    /**
     * Returns true if DHCP is enabled and return false if DHCP is disabled.
     *
     * @return true or false
     */
    boolean dhcpEnabled();

    /**
     * Indicates whether this tenantNetwork is shared across all tenants. By
     * default, only administrative user can change this value.
     *
     * @return true or false
     */
    boolean shared();

    /**
     * Returns a collection of hostRoutes.
     *
     * @return a collection of hostRoutes
     */
    Iterable<HostRoute> hostRoutes();

    /**
     * Returns the ipV6AddressMode. A valid value is dhcpv6-stateful,
     * dhcpv6-stateless, or slaac.
     *
     * @return ipV6AddressMode whose value is dhcpv6-stateful, dhcpv6-stateless
     *         or slaac
     */
    Mode ipV6AddressMode();

    /**
     * Returns the ipV6RaMode.A valid value is dhcpv6-stateful,
     * dhcpv6-stateless, or slaac.
     *
     * @return ipV6RaMode whose value is dhcpv6-stateful, dhcpv6-stateless or
     *         slaac
     */
    Mode ipV6RaMode();

    /**
     * Returns a collection of allocation_pools.
     *
     * @return a collection of allocationPools
     */
    Iterable<AllocationPool> allocationPools();
}
