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

import java.util.Date;
import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
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 javax.persistence.Transient;

import com.cloud.utils.db.GenericDao;

import org.apache.cloudstack.api.ApiCommandJobType;
import org.apache.cloudstack.api.InternalIdentity;

@Entity
@Table(name="async_job")
public class AsyncJobVO implements AsyncJob {
	public static final int CALLBACK_POLLING = 0;
	public static final int CALLBACK_EMAIL = 1;
	
	@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id = null;

    @Column(name="user_id")
    private long userId;
    
    @Column(name="account_id")
    private long accountId;
    
    @Column(name="session_key")
    private String sessionKey;
    
	@Column(name="job_cmd")
    private String cmd;
	
	@Column(name="job_cmd_originator")
	private String cmdOriginator;
    
	@Column(name="job_cmd_ver")
    private int cmdVersion;
    
    @Column(name="job_cmd_info", length=65535)
    private String cmdInfo;
    
    @Column(name="callback_type")
    private int callbackType;
    
    @Column(name="callback_address")
    private String callbackAddress;
    
    @Column(name="job_status")
    private int status;
    
    @Column(name="job_process_status")
    private int processStatus;
    
    @Column(name="job_result_code")
    private int resultCode;
    
    @Column(name="job_result", length=65535)
    private String result;
    
    @Enumerated(value=EnumType.STRING)
    @Column(name="instance_type", length=64)
    private ApiCommandJobType instanceType;
    
	@Column(name="instance_id", length=64)
    private Long instanceId;
    
    @Column(name="job_init_msid")
    private Long initMsid;

    @Column(name="job_complete_msid")
    private Long completeMsid;
    
    @Column(name=GenericDao.CREATED_COLUMN)
    private Date created;
    
    @Column(name="last_updated")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated;
    
    @Column(name="last_polled")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastPolled;
    
    @Column(name=GenericDao.REMOVED_COLUMN)
    private Date removed;
    
    @Column(name="uuid")
    private String uuid;

    @Transient
    private SyncQueueItemVO syncSource = null;

    @Transient
    private boolean fromPreviousSession = false;

    
    public AsyncJobVO() {
        this.uuid = UUID.randomUUID().toString();
    }

    public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo, Long instanceId, ApiCommandJobType instanceType) {
	this.userId = userId;
	this.accountId = accountId;
	this.cmd = cmd;
	this.cmdInfo = cmdInfo;
    	this.callbackType = CALLBACK_POLLING;
    	this.uuid = UUID.randomUUID().toString();
        this.instanceId = instanceId;
        this.instanceType = instanceType;
    }

    public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo,
	int callbackType, String callbackAddress, Long instanceId, ApiCommandJobType instanceType) {

	this(userId, accountId, cmd, cmdInfo, instanceId, instanceType);
	this.callbackType = callbackType;
	this.callbackAddress = callbackAddress;
    	this.uuid = UUID.randomUUID().toString();
    }


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

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

	@Override
    public long getUserId() {
		return userId;
	}

	public void setUserId(long userId) {
		this.userId = userId;
	}

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

	public void setAccountId(long accountId) {
		this.accountId = accountId;
	}

	@Override
    public String getCmd() {
		return cmd;
	}

	public void setCmd(String cmd) {
		this.cmd = cmd;
	}
	
	@Override
    public int getCmdVersion() {
		return cmdVersion;
	}
	
	public void setCmdVersion(int version) {
		cmdVersion = version;
	}

	@Override
    public String getCmdInfo() {
		return cmdInfo;
	}

	public void setCmdInfo(String cmdInfo) {
		this.cmdInfo = cmdInfo;
	}

	@Override
    public int getCallbackType() {
		return callbackType;
	}

	public void setCallbackType(int callbackType) {
		this.callbackType = callbackType;
	}

	@Override
    public String getCallbackAddress() {
		return callbackAddress;
	}

	public void setCallbackAddress(String callbackAddress) {
		this.callbackAddress = callbackAddress;
	}

	@Override
    public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}
	
	@Override
    public int getProcessStatus() {
		return processStatus;
	}
	
	public void setProcessStatus(int status) {
		processStatus = status;
	}
	
	@Override
    public int getResultCode() {
		return resultCode;
	}
	
	public void setResultCode(int resultCode) {
		this.resultCode = resultCode;
	}

	@Override
    public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	@Override
    public Long getInitMsid() {
		return initMsid;
	}

	public void setInitMsid(Long initMsid) {
		this.initMsid = initMsid;
	}

	@Override
    public Long getCompleteMsid() {
		return completeMsid;
	}

	public void setCompleteMsid(Long completeMsid) {
		this.completeMsid = completeMsid;
	}

	@Override
    public Date getCreated() {
		return created;
	}

	public void setCreated(Date created) {
		this.created = created;
	}

	@Override
    public Date getLastUpdated() {
		return lastUpdated;
	}

	public void setLastUpdated(Date lastUpdated) {
		this.lastUpdated = lastUpdated;
	}

	@Override
    public Date getLastPolled() {
		return lastPolled;
	}

	public void setLastPolled(Date lastPolled) {
		this.lastPolled = lastPolled;
	}

	@Override
    public Date getRemoved() {
		return removed;
	}

	public void setRemoved(Date removed) {
		this.removed = removed;
	}
	
    @Override
    public ApiCommandJobType getInstanceType() {
		return instanceType;
	}

	public void setInstanceType(ApiCommandJobType instanceType) {
		this.instanceType = instanceType;
	}

	@Override
    public Long getInstanceId() {
		return instanceId;
	}

	public void setInstanceId(Long instanceId) {
		this.instanceId = instanceId;
	}
	
    @Override
    public String getSessionKey() {
		return sessionKey;
	}

	public void setSessionKey(String sessionKey) {
		this.sessionKey = sessionKey;
	}
	
    @Override
    public String getCmdOriginator() {
		return cmdOriginator;
	}

	public void setCmdOriginator(String cmdOriginator) {
		this.cmdOriginator = cmdOriginator;
	}
	
	@Override
    public SyncQueueItemVO getSyncSource() {
        return syncSource;
    }
    
    public void setSyncSource(SyncQueueItemVO syncSource) {
        this.syncSource = syncSource;
    }
    
    @Override
    public boolean isFromPreviousSession() {
        return fromPreviousSession;
    }
    
    public void setFromPreviousSession(boolean fromPreviousSession) {
        this.fromPreviousSession = fromPreviousSession;
    }
    
    @Override
    public String getUuid() {
    	return this.uuid;
    }
    
    public void setUuid(String uuid) {
    	this.uuid = uuid;
    }
    
	@Override
    public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("AsyncJobVO {id:").append(getId());
		sb.append(", userId: ").append(getUserId());
		sb.append(", accountId: ").append(getAccountId());
		sb.append(", sessionKey: ").append(getSessionKey());
		sb.append(", instanceType: ").append(getInstanceType());
		sb.append(", instanceId: ").append(getInstanceId());
		sb.append(", cmd: ").append(getCmd());
		sb.append(", cmdOriginator: ").append(getCmdOriginator());
		sb.append(", cmdInfo: ").append(getCmdInfo());
		sb.append(", cmdVersion: ").append(getCmdVersion());
		sb.append(", callbackType: ").append(getCallbackType());
		sb.append(", callbackAddress: ").append(getCallbackAddress());
		sb.append(", status: ").append(getStatus());
		sb.append(", processStatus: ").append(getProcessStatus());
		sb.append(", resultCode: ").append(getResultCode());
		sb.append(", result: ").append(getResult());
		sb.append(", initMsid: ").append(getInitMsid());
		sb.append(", completeMsid: ").append(getCompleteMsid());
		sb.append(", lastUpdated: ").append(getLastUpdated());
		sb.append(", lastPolled: ").append(getLastPolled());
		sb.append(", created: ").append(getCreated());
		sb.append("}");
		return sb.toString();
	}
}
