/*******************************************************************************
 * Copyright (c) 2013 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.ote.statemachine;

import java.util.List;

public abstract class ChildStateMachineState extends BaseState{
   
   private StateMachine stateMachine;

   public ChildStateMachineState(StateMachine sm){
      stateMachine = new StateMachine(sm.getIdFactory(), getClass().getSimpleName(), sm.getRunInInputThread());
   }
   
   public ChildStateMachineState(StateMachine sm, String name){
      stateMachine = new StateMachine(sm.getIdFactory(), name, sm.getRunInInputThread());
   }
   
   public abstract void preRunStateMachine(BaseInput input);
   public abstract void postRunStateMachine(BaseInput input);
   
   @Override
   public final void run(BaseInput intput) {
      try {
         preRunStateMachine(intput);
         addToQueue(intput);
         postRunStateMachine(intput);
      } catch (InterruptedException e) {
         e.printStackTrace();
      } catch (Throwable e) {
         e.printStackTrace();
      }
   }
   
   @Override
   public void entry(){
      stateMachine.resetToInitialState();
      getCurrentState().entry();
   }
   
   void addToQueue(BaseInput input) throws Exception {
      stateMachine.addToQueue(input);
      stateMachine.processInput();           
   }
   
   public void setDefaultInitialState(BaseState initialState) {
      stateMachine.setDefaultInitialState(initialState);
   }
   
   public BaseState getCurrentState(){
      return stateMachine.getCurrentState();
   }

   public void newTransition(BaseState state, BaseInput input, BaseState nextState) throws Exception{
      stateMachine.newTransition(state, input, nextState);
   }

   List<BaseInput> getInputs() {
      return stateMachine.getInputs();
   }

   void setupChildStateMachines() throws Exception {
      stateMachine.setupChildStateMachines();
   }
}
