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

import java.util.Date;

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 com.cloud.ha.HighAvailabilityManager.Step;
import com.cloud.ha.HighAvailabilityManager.WorkType;
import com.cloud.utils.db.GenericDao;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;

@Entity
@Table(name="op_ha_work")
public class HaWorkVO {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    
    @Column(name="instance_id", updatable=false, nullable=false)
    private long instanceId;    // vm_instance id
    
    @Column(name="mgmt_server_id", nullable=true)
    private Long serverId;
    
    @Column(name=GenericDao.CREATED_COLUMN)
    private Date created;
    
    @Column(name="state", nullable=false)
    @Enumerated(value=EnumType.STRING)
    private State previousState;
    
    @Column(name="host_id", nullable=false)
    private long hostId;
    
    @Column(name="taken", nullable=true)
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date dateTaken;
    
    @Column(name="time_to_try", nullable=true)
    private long timeToTry;
    
    @Column(name="type", updatable = false, nullable=false)
    @Enumerated(value=EnumType.STRING)
    private WorkType workType;
    
    @Column(name="updated")
    private long updateTime;
    
    @Column(name="step", nullable = false)
    @Enumerated(value=EnumType.STRING)
    private HighAvailabilityManager.Step step;
    
    @Column(name="vm_type", updatable = false, nullable=false)
    @Enumerated(value=EnumType.STRING)
    private VirtualMachine.Type type;
    
    @Column(name="tried")
    int timesTried;
    
    protected HaWorkVO() {
    }
    
    public Long getId() {
        return id;
    }
    
    public long getInstanceId() {
        return instanceId;
    }
    
    public WorkType getWorkType() {
        return workType;
    }
    
    public void setStep(final HighAvailabilityManager.Step step) {
        this.step = step;
    }
    
    public Long getServerId() {
        return serverId;
    }
    
    public VirtualMachine.Type getType() {
        return type;
    }

    public void setServerId(final Long serverId) {
        this.serverId = serverId;
    }

    public Date getCreated() {
        return created;
    }
    
    public void setHostId(final long hostId) {
        this.hostId = hostId;
    }
    
    public HighAvailabilityManager.Step getStep() {
        return step;
    }

    public State getPreviousState() {
        return previousState;
    }

    public Date getDateTaken() {
        return dateTaken;
    }
    
    public long getHostId() {
        return hostId;
    }

    public void setDateTaken(final Date taken) {
        this.dateTaken = taken;
    }
    
    public void setTimesTried(final int time) {
        timesTried = time;
    }
    
    public boolean canScheduleNew(final long interval) {
        return (timeToTry + interval) < (System.currentTimeMillis() >> 10);
    }
    
    public int getTimesTried() {
        return timesTried;
    }
    
    public long getUpdateTime() {
    	return updateTime;
    }
    
    public void setUpdateTime(long time) {
    	updateTime = time;
    }

    public long getTimeToTry() {
        return timeToTry;
    }

    public void setTimeToTry(final long timeToTry) {
        this.timeToTry = timeToTry;
    }
    
    public void setPreviousState(State state) {
        this.previousState = state;
    }
    
    public HaWorkVO(final long instanceId, final VirtualMachine.Type type, final WorkType workType, final Step step, final long hostId, final State previousState, final int timesTried, final long updated) {
        this.workType = workType;
        this.type = type;
        this.instanceId = instanceId;
        this.serverId = null;
        this.hostId = hostId;
        this.previousState = previousState;
        this.dateTaken = null;
        this.timesTried = timesTried;
        this.step = step;
        this.timeToTry = System.currentTimeMillis() >> 10;
        this.updateTime = updated;
    }
    
    @Override
	public String toString() {
    	return new StringBuilder("HAWork[").append(id).append("-").append(workType).append("-").append(instanceId).append("-").append(previousState).append("-").append(step).append("]").toString();
    }
}
