/*
 * Copyright (C) 2011 Citrix Systems, Inc.  All rights reserved.
 *
 * 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 com.cloud.stack.models;

import com.google.gson.annotations.SerializedName;

/**
 * @author slriv
 *
 */
public class CloudStackAccount {
	@SerializedName(ApiConstants.ID)
	private String id;
	@SerializedName(ApiConstants.NAME)
	private String name;
	@SerializedName(ApiConstants.ACCOUNT_TYPE)
	private Long accountType;
	@SerializedName(ApiConstants.DOMAIN_ID)
	private String domainId;
	@SerializedName(ApiConstants.DOMAIN)
	private String domain;
	@SerializedName(ApiConstants.RECEIVED_BYTES)
	private Long receivedBytes;
	@SerializedName(ApiConstants.SENT_BYTES)
	private Long sentBytes;
	@SerializedName(ApiConstants.VM_LIMIT)
	private String vmLimit;
	@SerializedName(ApiConstants.VM_TOTAL)
	private Long vmTotal;
	@SerializedName(ApiConstants.VM_AVAILABLE)
	private String vmAvailable;
	@SerializedName(ApiConstants.IP_LIMIT)
	private String ipLimit;
	@SerializedName(ApiConstants.IP_TOTAL)
	private Long ipTotal;
	@SerializedName(ApiConstants.IP_AVAILABLE)
	private String ipAvailable;
	@SerializedName(ApiConstants.VOLUME_LIMIT)
	private String volumeLimit;
	@SerializedName(ApiConstants.VOLUME_TOTAL)
	private Long volumeTotal;
	@SerializedName(ApiConstants.VOLUME_AVAILABLE)
	private String volumeAvailable;
	@SerializedName(ApiConstants.SNAPSHOT_LIMIT)
	private String snapShotLimit;
	@SerializedName(ApiConstants.SNAPSHOT_TOTAL)
	private Long snapShotTotal;
	@SerializedName(ApiConstants.SNAPSHOT_AVAILABLE)
	private String snapShotAvailable;
	@SerializedName(ApiConstants.TEMPLATE_LIMIT)
	private String templateLimit;
	@SerializedName(ApiConstants.TEMPLATE_TOTAL)
	private String templateTotal;
	@SerializedName(ApiConstants.TEMPLATE_AVAILABLE)
	private String templateAvailable;
	@SerializedName(ApiConstants.VM_STOPPED)
	private Long vmStopped;
	@SerializedName(ApiConstants.VM_RUNNING)
	private Long vmRunning;
	@SerializedName(ApiConstants.ENABLED)
	private String enabled;
	@SerializedName(ApiConstants.USER)
	private CloudStackUser[] user;
	@SerializedName(ApiConstants.DEFAULT_ZONE_ID)     
	private String defaultZoneId;
	
	/**
	 * 
	 */
	public CloudStackAccount() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @return the id
	 */
	public String getId() {
		return id;
    }
	
    public void setId(String id) {
        this.id = id;
    }

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
    }
	
    public void setName(String name) {
        this.name = name;
    }

	/**
	 * @return the accountType
	 */
	public Long getAccountType() {
		return accountType;
	}

	/**
	 * @return the domainId
	 */
	public String getDomainId() {
		return domainId;
	}

	/**
	 * @return the domain
	 */
	public String getDomain() {
		return domain;
	}

	/**
	 * @return the receivedBytes
	 */
	public Long getReceivedBytes() {
		return receivedBytes;
	}

	/**
	 * @return the sentBytes
	 */
	public Long getSentBytes() {
		return sentBytes;
	}

	/**
	 * @return the vmLimit
	 */
	public String getVmLimit() {
		return vmLimit;
	}

	/**
	 * @return the vmTotal
	 */
	public Long getVmTotal() {
		return vmTotal;
	}

	/**
	 * @return the vmAvailable
	 */
	public String getVmAvailable() {
		return vmAvailable;
	}

	/**
	 * @return the ipLimit
	 */
	public String getIpLimit() {
		return ipLimit;
	}

	/**
	 * @return the ipTotal
	 */
	public Long getIpTotal() {
		return ipTotal;
	}

	/**
	 * @return the ipAvailable
	 */
	public String getIpAvailable() {
		return ipAvailable;
	}

	/**
	 * @return the volumeLimit
	 */
	public String getVolumeLimit() {
		return volumeLimit;
	}

	/**
	 * @return the volumeTotal
	 */
	public Long getVolumeTotal() {
		return volumeTotal;
	}

	/**
	 * @return the volumeAvailable
	 */
	public String getVolumeAvailable() {
		return volumeAvailable;
	}

	/**
	 * @return the snapShotLimit
	 */
	public String getSnapShotLimit() {
		return snapShotLimit;
	}

	/**
	 * @return the snapShotTotal
	 */
	public Long getSnapShotTotal() {
		return snapShotTotal;
	}

	/**
	 * @return the snapShotAvailable
	 */
	public String getSnapShotAvailable() {
		return snapShotAvailable;
	}

	/**
	 * @return the templateLimit
	 */
	public String getTemplateLimit() {
		return templateLimit;
	}

	/**
	 * @return the templateTotal
	 */
	public String getTemplateTotal() {
		return templateTotal;
	}

	/**
	 * @return the templateAvailable
	 */
	public String getTemplateAvailable() {
		return templateAvailable;
	}

	/**
	 * @return the vmStopped
	 */
	public Long getVmStopped() {
		return vmStopped;
	}

	/**
	 * @return the vmRunning
	 */
	public Long getVmRunning() {
		return vmRunning;
	}

	/**
	 * @return the enabled
	 */
	public String getEnabled() {
		return enabled;
	}

	/**
	 * @return the user
	 */
	public CloudStackUser[] getUser() {
		return user;
	}
	
    /**        
     * @return the defaultZoneId
     */
    public String getDefaultZoneId() {
        return defaultZoneId;
    }
	
    public void setdefaultZoneId(String defaultZoneId) {
        this.defaultZoneId = defaultZoneId;
    }
}
