// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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 com.cloud.vm;

import java.io.Serializable;
import java.net.URI;

import org.apache.cloudstack.api.InternalIdentity;

import com.cloud.network.Network;
import com.cloud.network.Networks.AddressFormat;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.Mode;
import com.cloud.network.Networks.TrafficType;
import com.cloud.vm.Nic.ReservationStrategy;

public class NicProfile implements InternalIdentity, Serializable {
    private static final long serialVersionUID = 4997005771736090304L;

    long id;
    long networkId;
    long vmId;
    String reservationId;
    Integer deviceId;

    String name;
    String uuid;

    String macAddress;
    BroadcastDomainType broadcastType;
    Mode mode;
    AddressFormat format;
    TrafficType trafficType;
    URI isolationUri;
    URI broadcastUri;
    ReservationStrategy strategy;
    boolean defaultNic;
    Integer networkRate;
    boolean isSecurityGroupEnabled;

    // IPv4
    String iPv4Address;
    String iPv4Netmask;
    String iPv4Gateway;
    String iPv4Dns1;
    String iPv4Dns2;
    String requestedIPv4;

    // IPv6
    String iPv6Address;
    String iPv6Gateway;
    String iPv6Cidr;
    String iPv6Dns1;
    String iPv6Dns2;
    String requestedIPv6;

    //
    // CONSTRUCTORS
    //

    public NicProfile() {
    }

    public NicProfile(Nic nic, Network network, URI broadcastUri, URI isolationUri, Integer networkRate, boolean isSecurityGroupEnabled, String name) {
        id = nic.getId();
        networkId = network.getId();
        mode = network.getMode();
        broadcastType = network.getBroadcastDomainType();
        trafficType = network.getTrafficType();
        format = nic.getAddressFormat();

        iPv4Address = nic.getIPv4Address();
        iPv4Netmask = nic.getIPv4Netmask();
        iPv4Gateway = nic.getIPv4Gateway();

        iPv6Address = nic.getIPv6Address();
        iPv6Gateway = nic.getIPv6Gateway();
        iPv6Cidr = nic.getIPv6Cidr();

        macAddress = nic.getMacAddress();
        reservationId = nic.getReservationId();
        strategy = nic.getReservationStrategy();
        deviceId = nic.getDeviceId();
        defaultNic = nic.isDefaultNic();
        this.broadcastUri = broadcastUri;
        this.isolationUri = isolationUri;

        this.isSecurityGroupEnabled = isSecurityGroupEnabled;
        vmId = nic.getInstanceId();
        this.name = name;
        uuid = nic.getUuid();

        if (networkRate != null) {
            this.networkRate = networkRate;
        }
    }

    public NicProfile(String requestedIPv4, String requestedIPv6) {
        this.requestedIPv4 = requestedIPv4;
        this.requestedIPv6 = requestedIPv6;
    }

    public NicProfile(ReservationStrategy strategy, String iPv4Address, String macAddress, String iPv4gateway, String iPv4netmask) {
        format = AddressFormat.Ip4;
        this.iPv4Address = iPv4Address;
        this.iPv4Gateway = iPv4gateway;
        this.iPv4Netmask = iPv4netmask;
        this.macAddress = macAddress;
        this.strategy = strategy;
    }

    //
    // GET & SET GENERAL
    //

    @Override
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getNetworkId() {
        return networkId;
    }

    public void setNetworId(long networkId){
        this.networkId = networkId;
    }

    public long getVirtualMachineId() {
        return vmId;
    }

    public void setVirtualMachineId(long virtualMachineId) {
        this.vmId = virtualMachineId;
    }

    public String getReservationId() {
        return reservationId;
    }

    public void setReservationId(String reservationId) {
        this.reservationId = reservationId;
    }

    public Integer getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(int deviceId) {
        this.deviceId = deviceId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getMacAddress() {
        return macAddress;
    }

    public void setMacAddress(String macAddress) {
        this.macAddress = macAddress;
    }

    public BroadcastDomainType getBroadcastType() {
        return broadcastType;
    }

    public void setBroadcastType(BroadcastDomainType broadcastType) {
        this.broadcastType = broadcastType;
    }

    public Mode getMode() {
        return mode;
    }

    public void setMode(Mode mode) {
        this.mode = mode;
    }

    public AddressFormat getFormat() {
        return format;
    }

    public void setFormat(AddressFormat format) {
        this.format = format;
    }

    public TrafficType getTrafficType() {
        return trafficType;
    }

    public void setTrafficType(TrafficType trafficType) {
        this.trafficType = trafficType;
    }

    public URI getIsolationUri() {
        return isolationUri;
    }

    public void setIsolationUri(URI isolationUri) {
        this.isolationUri = isolationUri;
    }

    public URI getBroadCastUri() {
        return broadcastUri;
    }

    public void setBroadcastUri(URI broadcastUri) {
        this.broadcastUri = broadcastUri;
    }

    public ReservationStrategy getReservationStrategy() {
        return strategy;
    }

    public void setReservationStrategy(ReservationStrategy strategy) {
        this.strategy = strategy;
    }

    public boolean isDefaultNic() {
        return defaultNic;
    }

    public void setDefaultNic(boolean defaultNic) {
        this.defaultNic = defaultNic;
    }

    public Integer getNetworkRate() {
        return networkRate;
    }

    public void setNetworkRate(Integer networkRate) {
        this.networkRate = networkRate;
    }

    public boolean isSecurityGroupEnabled() {
        return isSecurityGroupEnabled;
    }

    public void setSecurityGroupEnabled(boolean enabled) {
        isSecurityGroupEnabled = enabled;
    }

    //
    // GET & SET IPv4
    //

    public String getIPv4Address() {
        return iPv4Address;
    }

    public void setIPv4Address(String ipv4Address) {
        this.iPv4Address = ipv4Address;
    }

    public String getIPv4Netmask() {
        return iPv4Netmask;
    }

    public void setIPv4Netmask(String ipv4Netmask) {
        this.iPv4Netmask = ipv4Netmask;
    }

    public String getIPv4Gateway() {
        return iPv4Gateway;
    }

    public void setIPv4Gateway(String ipv4Gateway) {
        this.iPv4Gateway = ipv4Gateway;
    }

    public String getIPv4Dns1() {
        return iPv4Dns1;
    }

    public void setIPv4Dns1(String ipv4Dns1) {
        this.iPv4Dns1 = ipv4Dns1;
    }

    public String getIPv4Dns2() {
        return iPv4Dns2;
    }

    public void setIPv4Dns2(String ipv4Dns2) {
        this.iPv4Dns2 = ipv4Dns2;
    }

    public String getRequestedIPv4() {
        return requestedIPv4;
    }

    public void setRequestedIPv4(String requestedIPv4) {
        this.requestedIPv4 = requestedIPv4;
    }

    //
    // GET & SET IPv6
    //

    public String getIPv6Address() {
        return iPv6Address;
    }

    public void setIPv6Address(String ipv6Address) {
        this.iPv6Address = ipv6Address;
    }

    public String getIPv6Gateway() {
        return iPv6Gateway;
    }

    public void setIPv6Gateway(String ipv6Gateway) {
        this.iPv6Gateway = ipv6Gateway;
    }

    public String getIPv6Cidr() {
        return iPv6Cidr;
    }

    public void setIPv6Cidr(String ipv6Cidr) {
        this.iPv6Cidr = ipv6Cidr;
    }

    public String getIPv6Dns1() {
        return iPv6Dns1;
    }

    public void setIPv6Dns1(String ipv6Dns1) {
        this.iPv6Dns1 = ipv6Dns1;
    }

    public String getIPv6Dns2() {
        return iPv6Dns2;
    }

    public void setIPv6Dns2(String ipv6Dns2) {
        this.iPv6Dns2 = ipv6Dns2;
    }

    public String getRequestedIPv6() {
        return requestedIPv6;
    }

    public void setRequestedIPv6(String requestedIPv6) {
        this.requestedIPv6 = requestedIPv6;
    }

    //
    // OTHER METHODS
    //

    public void deallocate() {
        mode = null;
        format = null;
        broadcastType = null;
        trafficType = null;

        iPv4Address = null;
        iPv4Netmask = null;
        iPv4Gateway = null;
        iPv4Dns1 = null;
        iPv4Dns2 = null;

        iPv6Address = null;
        iPv6Gateway = null;
        iPv6Cidr = null;
        iPv6Dns1 = null;
        iPv6Dns2 = null;

        macAddress = null;
        reservationId = null;
        strategy = null;
        deviceId = null;
        broadcastUri = null;
        isolationUri = null;

    }

    @Override
    public String toString() {
        return new StringBuilder("NicProfile[").append(id)
                .append("-")
                .append(vmId)
                .append("-")
                .append(reservationId)
                .append("-")
                .append(iPv4Address)
                .append("-")
                .append(broadcastUri)
                .toString();
    }
}