/**
 *  Copyright (C) 2010 Cloud.com, Inc.  All rights reserved.
 * 
 * This software is licensed under the GNU General Public License v3 or later.
 * 
 * It is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package com.cloud.vm;

import java.util.List;

import com.cloud.utils.fsm.StateMachine;

public enum State {
    Creating(true),
    Starting(true),
    Running(false),
    Stopping(true),
    Stopped(false),
    Destroyed(false),
    Expunging(true),
    Migrating(true),
    Error(false),
    Unknown(false);
    
    private final boolean _transitional;
    
    private State(boolean transitional) {
    	_transitional = transitional;
    }
    
    public boolean isTransitional() {
    	return _transitional;
    }
    
    public static String[] toStrings(State... states) {
        String[] strs = new String[states.length];
        for (int i = 0; i < states.length; i++) {
            strs[i] = states[i].toString();
        }
        
        return strs;
    }
    
    public State getNextState(VirtualMachine.Event e) {
        return s_fsm.getNextState(this, e);
    }

    public State[] getFromStates(VirtualMachine.Event e) {
        List<State> from = s_fsm.getFromStates(this, e);
        return from.toArray(new State[from.size()]);
    }
    
    protected static final StateMachine<State, VirtualMachine.Event> s_fsm = new StateMachine<State, VirtualMachine.Event>();
    static {
    	s_fsm.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating);
    	s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped);
    	s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed);
    	s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting);
    	s_fsm.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed);
    	s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped);
    	s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped);
    	s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting);
    	s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationSucceeded, State.Running);
    	s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationFailed, State.Stopped);
    	s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportRunning, State.Running);
    	s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportStopped, State.Stopped);
    	s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.RecoveryRequested, State.Stopped);
    	s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.ExpungeOperation, State.Expunging);
    	s_fsm.addTransition(State.Creating, VirtualMachine.Event.MigrationRequested, State.Destroyed);
    	s_fsm.addTransition(State.Running, VirtualMachine.Event.MigrationRequested, State.Migrating);
    	s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportRunning, State.Running);
    	s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportStopped, State.Stopped);
    	s_fsm.addTransition(State.Running, VirtualMachine.Event.StopRequested, State.Stopping);
    	s_fsm.addTransition(State.Migrating, VirtualMachine.Event.MigrationRequested, State.Migrating);
    	s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationSucceeded, State.Running);
    	s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running);
    	s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportRunning, State.Running);
    	s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportStopped, State.Stopped);
    	s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationSucceeded, State.Stopped);
    	s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationFailed, State.Running);
    	s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportRunning, State.Running);
    	s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportStopped, State.Stopped);
    	s_fsm.addTransition(State.Stopping, VirtualMachine.Event.StopRequested, State.Stopping);
    	s_fsm.addTransition(State.Expunging, VirtualMachine.Event.OperationFailed, State.Expunging);
    	s_fsm.addTransition(State.Expunging, VirtualMachine.Event.ExpungeOperation, State.Expunging);
    }
}
