/*******************************************************************************
 * 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.ArrayList;
import java.util.List;


class StateTransitionTable {

   private InputLookup[] inputLookup;
   private List<BaseInput> inputs;
   private List<ChildStateMachineState> children;
   
   StateTransitionTable(int initialInputSize, int initialStateSize){
      inputs = new ArrayList<BaseInput>();
      children = new ArrayList<ChildStateMachineState>();
      inputLookup = new InputLookup[initialInputSize];
      for(int i = 0; i < inputLookup.length; i++){
         inputLookup[i] = new InputLookup(initialStateSize);
      }
   }
   
   BaseState getTransition(BaseInput input, BaseState currentstate) {
      if(input != null && currentstate != null){
         InputLookup lookup = inputLookup[input.getId()];
         if(lookup != null){
            if(currentstate.getId() < 0){
               throw new IllegalStateException("negative state id's are not allowed");
            }
            BaseState state = lookup.get(currentstate.getId());
            if(state == null){
               return currentstate;
            } else {
               return state;
            }
         }
      }
      return null;
   }

   void put(BaseState state, BaseInput input, BaseState nextState) throws Exception {
      if(!inputs.contains(input)){
         inputs.add(input);
      }
      if(state instanceof ChildStateMachineState){
         if(!children.contains(state)){
            children.add((ChildStateMachineState) state);
         }
      }
      if(nextState instanceof ChildStateMachineState){
         if(!children.contains(nextState)){
            children.add((ChildStateMachineState) nextState);
         }
      }
      
      if(!inputLookup[input.getId()].put(state.getId(), nextState)){
         throw new Exception(String.format("State transition collision [%s][%s] already exists{ new[%s] old[%s] }", state.toString(), input.toString(), nextState, getTransition(input, state)));
      }
   }
   
   List<BaseInput> getInputs() {
      return inputs;
   }
   
   List<ChildStateMachineState> getChildren(){
      return children;
   }

   private static class InputLookup {
      BaseState[] nextStateLookup;
      
      public InputLookup(int initialStateSize) {
         nextStateLookup = new BaseState[initialStateSize];
      }

      public boolean put(int id, BaseState nextState) {
         if(nextStateLookup[id] != null){
            return false;
         }
         nextStateLookup[id] = nextState;
         return true;
      }

      public BaseState get(int id) {
         return nextStateLookup[id];
      }
   }


}
