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

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


/**
 * Represents the network information given by Neutron.
 */
public final class OpenstackNetwork {

    private String name;
    private String tenantId;
    private String segmentId;
    private String id;
    private NetworkType networkType;

    public enum NetworkType {
        /**
         * Currently only VXLAN moded is supported.
         */
        VXLAN,
        VLAN,
        STT,
        LOCAL
    }

    /**
     * Returns the builder object of the OpenstackNetwork class.
     *
     * @return OpenstackNetwork builder object
     */
    public static OpenstackNetwork.Builder builder() {
        return new Builder();
    }

    private OpenstackNetwork(String name, String tenantId, String id, String sid,
                             NetworkType type) {
        this.name = checkNotNull(name);
        this.tenantId = checkNotNull(tenantId);
        this.segmentId = checkNotNull(sid);
        this.id = checkNotNull(id);
        this.networkType = type;
    }

    public String name() {
        return this.name;
    }

    public String tenantId() {
        return this.tenantId;
    }

    public String id() {
        return this.id;
    }

    public String segmentId() {
        return this.segmentId;
    }

    public NetworkType networkType() {
        return this.networkType;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
       return super.clone();
    }

    public static final class Builder {
        private String name;
        private String tenantId;
        private String id;
        private String sid;
        private NetworkType networkType;

        public Builder name(String name) {
            this.name = name;

            return this;
        }

        public Builder tenantId(String tenantId) {
            this.tenantId = tenantId;

            return this;
        }

        public Builder id(String id) {
            this.id = id;

            return this;
        }

        public Builder segmentId(String sid) {
            this.sid = sid;

            return this;
        }

        public Builder networkType(NetworkType type) {
            this.networkType = type;

            return this;
        }

        public OpenstackNetwork build() {
            return new OpenstackNetwork(name, tenantId, id, sid, networkType);
        }

    }
}
