// 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.capacity;

import javax.persistence.Transient;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.api.InternalIdentity;

@Entity
@Table(name="op_host_capacity")
public class CapacityVO implements Capacity {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private long id;

    @Column(name="host_id")
    private Long hostOrPoolId;

    @Column(name="data_center_id")
    private Long dataCenterId;

    @Column(name="pod_id")
    private Long podId;

    @Column(name="cluster_id")
    private Long clusterId;

    @Column(name="used_capacity")
    private long usedCapacity;

    @Column(name="reserved_capacity")
    private long reservedCapacity;
    
    @Column(name="total_capacity")
    private long totalCapacity;

    @Column(name="capacity_type")
    private short capacityType;
    
    @Column(name="capacity_state")
    private CapacityState capacityState;
    
    @Column(name=GenericDao.CREATED_COLUMN)
    protected Date created;    
    
    @Column(name="update_time", updatable=true, nullable=true)
    @Temporal(value=TemporalType.TIMESTAMP)
    protected Date updateTime;
    
    @Transient
    private Float usedPercentage;
    
    public CapacityVO() {}

    public CapacityVO(Long hostId, Long dataCenterId, Long podId, Long clusterId, long usedCapacity, long totalCapacity, short capacityType) {
        this.hostOrPoolId = hostId;
        this.dataCenterId = dataCenterId;
        this.podId = podId;
        this.clusterId = clusterId;
        this.usedCapacity = usedCapacity;
        this.totalCapacity = totalCapacity;
        this.capacityType = capacityType;
        this.updateTime = new Date();
        this.capacityState = CapacityState.Enabled;
    }
    
    public CapacityVO(Long dataCenterId, Long podId, Long clusterId, short capacityType, float usedPercentage) {        
        this.dataCenterId = dataCenterId;
        this.podId = podId;
        this.clusterId = clusterId;
        this.capacityType = capacityType;
        this.usedPercentage = usedPercentage;
        this.capacityState = CapacityState.Enabled;
    }

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

    @Override
    public Long getHostOrPoolId() {
        return hostOrPoolId;
    }
    
    public void setHostId(Long hostId) {
        this.hostOrPoolId = hostId;
    }
    @Override
    public Long getDataCenterId() {
        return dataCenterId;
    }
    public void setDataCenterId(Long dataCenterId) {
        this.dataCenterId = dataCenterId;
    }
    
    @Override
    public Long getPodId() {
        return podId;
    }
    public void setPodId(long podId) {
        this.podId = new Long(podId);
    }
    
    @Override
    public Long getClusterId() {
        return clusterId;
    }
    public void setClusterId(long clusterId) {
        this.clusterId = new Long(clusterId);
    }
    
    @Override
    public long getUsedCapacity() {
        return usedCapacity;
    }
    public void setUsedCapacity(long usedCapacity) {
        this.usedCapacity = usedCapacity;
        this.setUpdateTime (new Date());
    }
    @Override
    public long getReservedCapacity() {
        return reservedCapacity;
    }
    public void setReservedCapacity(long reservedCapacity) {
        this.reservedCapacity = reservedCapacity;
        this.setUpdateTime (new Date());
    }
    @Override
    public long getTotalCapacity() {
        return totalCapacity;
    }
    public void setTotalCapacity(long totalCapacity) {
        this.totalCapacity = totalCapacity;
        this.setUpdateTime (new Date());
    }
    @Override
    public short getCapacityType() {
        return capacityType;
    }
    public void setCapacityType(short capacityType) {
        this.capacityType = capacityType;
    }

	public CapacityState getCapacityState() {
        return capacityState;
    }

    public void setCapacityState(CapacityState capacityState) {
        this.capacityState = capacityState;
    }

    public Date getCreated() {
		return created;
	}

	public Date getUpdateTime() {
		return updateTime;
	}

	public void setUpdateTime(Date updateTime) {
		this.updateTime = updateTime;
	}

	@Override
    public Float getUsedPercentage() {
        return usedPercentage;
    }

    public void setUsedPercentage(float usedPercentage) {
        this.usedPercentage = usedPercentage;
    }

    @Override
    public String getUuid() {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }
}
