// 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.network.vpc;


public class StaticRouteProfile implements StaticRoute {
    private long id;
    private String uuid;
    private String targetCidr;
    private long accountId;
    private long domainId;
    private long gatewayId;
    private StaticRoute.State state;
    private long vpcId;
    String vlanTag;
    String gateway;
    String netmask;
    String ipAddress;


    public StaticRouteProfile(StaticRoute staticRoute, VpcGateway gateway) {
        this.id = staticRoute.getId();
        this.uuid = staticRoute.getUuid();
        this.targetCidr = staticRoute.getCidr();
        this.accountId = staticRoute.getAccountId();
        this.domainId = staticRoute.getDomainId();
        this.gatewayId = staticRoute.getVpcGatewayId();
        this.state = staticRoute.getState();
        this.vpcId = staticRoute.getVpcId();
        this.vlanTag = gateway.getVlanTag();
        this.gateway = gateway.getGateway();
        this.netmask = gateway.getNetmask();
        this.ipAddress = gateway.getIp4Address();
    }

    @Override
    public long getAccountId() {
        return accountId;
    }

    @Override
    public long getDomainId() {
        return domainId;
    }

    @Override
    public long getVpcGatewayId() {
        return gatewayId;
    }

    @Override
    public String getCidr() {
        return targetCidr;
    }

    @Override
    public State getState() {
        return state;
    }

    @Override
    public Long getVpcId() {
       return vpcId;
    }

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


    @Override
    public String getUuid() {
        return uuid;
    }

    public String getVlanTag() {
        return vlanTag;
    }

    public String getIp4Address() {
        return ipAddress;
    }

    public String getGateway() {
        return gateway;
    }

    public String getNetmask() {
        return netmask;
    }

}
