//
// 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 org.apache.cloudstack.network.opendaylight.api.model;

import java.util.UUID;

import com.google.gson.annotations.SerializedName;

public class NeutronNetwork {

    private UUID id;
    private String name;
    private boolean shared;
    private String tenantId;
    @SerializedName("provider:network_type")
    private String networkType;
    @SerializedName("provider:segmentation_id")
    private Integer segmentationId;

    public NeutronNetwork() {
    }

    public NeutronNetwork(final UUID id, final String name, final boolean shared, final String tenantId, final String networkType, final Integer segmentationId) {
        this.id = id;
        this.name = name;
        this.shared = shared;
        this.tenantId = tenantId;
        this.networkType = networkType;
        this.segmentationId = segmentationId;
    }

    public UUID getId() {
        return id;
    }

    public void setId(final UUID uuid) {
        id = uuid;
    }

    public String getNetworkType() {
        return networkType;
    }

    public void setNetworkType(final String networkType) {
        this.networkType = networkType;
    }

    public String getName() {
        return name;
    }

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

    public boolean isShared() {
        return shared;
    }

    public void setShared(final boolean shared) {
        this.shared = shared;
    }

    public Integer getSegmentationId() {
        return segmentationId;
    }

    public void setSegmentationId(final Integer segmentationId) {
        this.segmentationId = segmentationId;
    }

    public String getTenantId() {
        return tenantId;
    }

    public void setTenantId(final String tenantId) {
        this.tenantId = tenantId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (name == null ? 0 : name.hashCode());
        result = prime * result + (networkType == null ? 0 : networkType.hashCode());
        result = prime * result + (segmentationId == null ? 0 : segmentationId.hashCode());
        result = prime * result + (shared ? 1231 : 1237);
        result = prime * result + (tenantId == null ? 0 : tenantId.hashCode());
        result = prime * result + (id == null ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        NeutronNetwork other = (NeutronNetwork) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (networkType == null) {
            if (other.networkType != null) {
                return false;
            }
        } else if (!networkType.equals(other.networkType)) {
            return false;
        }
        if (segmentationId == null) {
            if (other.segmentationId != null) {
                return false;
            }
        } else if (!segmentationId.equals(other.segmentationId)) {
            return false;
        }
        if (shared != other.shared) {
            return false;
        }
        if (tenantId == null) {
            if (other.tenantId != null) {
                return false;
            }
        } else if (!tenantId.equals(other.tenantId)) {
            return false;
        }
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }
        return true;
    }

    public boolean equalsIgnoreUuid(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        NeutronNetwork other = (NeutronNetwork) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (networkType == null) {
            if (other.networkType != null) {
                return false;
            }
        } else if (!networkType.equals(other.networkType)) {
            return false;
        }
        if (segmentationId == null) {
            if (other.segmentationId != null) {
                return false;
            }
        } else if (!segmentationId.equals(other.segmentationId)) {
            return false;
        }
        if (shared != other.shared) {
            return false;
        }
        if (tenantId == null) {
            if (other.tenantId != null) {
                return false;
            }
        } else if (!tenantId.equals(other.tenantId)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "NeutronNetwork [uuid=" + id + ", networkType=" + networkType + ", name=" + name + ", shared=" + shared + ", segmentationId=" + segmentationId + ", tenantId="
                + tenantId + "]";
    }
}