import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import java.util.Enumeration;
import java.io.*;
import java.util.*;
//import java.lancs.*;


public class gsTimer extends Behavior {
        WakeupOnElapsedTime m_timer;
        WakeupOnElapsedTime animTimer;

        TransformGroup          m_objTrans;
        TransformGroup           animTrans;
        Transform3D m_t3d = new Transform3D();

        BoundingSphere BOUNDS = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 800.0);
        Alpha alpha = new Alpha(1, Alpha.INCREASING_ENABLE, 0, 0, 1000, 0, 0, 0, 0, 0);
        PositionInterpolator p;
        RotationalInterpolator r;

        double m_angle = 0.0;
        Vector3f m_vTranslate = new Vector3f();


        Vector cmdsVector = new Vector();
        
        int m_counter = 0;
                       

        public gsTimer (TransformGroup tg) {
                m_objTrans = tg;
                tg.getTransform(m_t3d);
        }



        public void readFile()
            {

            try{
            
            BufferedReader  UserInput = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Enter name of file: " );

            String filename = UserInput.readLine();

            BufferedReader bin = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));              
                                                                                                    
                                                                                                         
            boolean loop = true;                                                                                        
                                                                                                 
                                                                              
            while(loop)                                                                             
               {                                                                                    
                                                                                                    
               String line = bin.readLine().trim();                                                 
               System.out.println("+ " + line);                                                     
               if(line.equals("EOF"))                                                               
                 {                                                                                  
                 loop = false;                                                                      
                 break;                                                                             
                 }                                                                                  
               
               StringTokenizer st = new StringTokenizer(line);  
               
               if(st.countTokens() != 2)
                  {
                  System.out.println("Invalid no. of arguments: " + st.countTokens());
                  System.exit(0);
                  }

               while(st.hasMoreTokens())
                  {
                  String comd = st.nextToken();

                  if((comd.equals("FORWARD"))||(comd.equals("REVERSE"))||(comd.equals("LEFT"))||(comd.equals("RIGHT")))
                     {
                     int val = Integer.parseInt(st.nextToken());
                     cmdsVector.addElement(new Movement(comd, val));                                           
                     }
                  else
                     {
                     System.out.println("Invalid Command: " + comd);
                     System.exit(0);
                     }

                  } //end of while
                  
               } //end of while

            } //end of try
            catch (IOException e) 
               {
               System.out.println("Error has occured: " + e.getMessage());
               System.exit(0);   
               }



            } // end of method


        // this sets up the type of bahaviour (timed)
        public void initialize()
           {
            readFile();
            
            m_timer = new WakeupOnElapsedTime(1000);
            
            this.wakeupOn(m_timer);
            
           } //end of method


        // This method is called everytime a timeout finishes
        public void processStimulus(Enumeration criteria) {
                WakeupCriterion wakeup = null;
                AWTEvent[] event = null;

                // Process all pending wakeups
                while( criteria.hasMoreElements() ) 
                  {
                  wakeup = (WakeupCriterion)criteria.nextElement( );
                  if ( wakeup instanceof WakeupOnElapsedTime )
                          evTimer();
                }

                m_counter++;
                if (m_counter < cmdsVector.size())
                     this.wakeupOn( m_timer );
       }


        void evTimer () {

                Movement tempMV = (Movement) cmdsVector.elementAt(m_counter);

                

                String s = tempMV.getMovement().toUpperCase();
                int vlue = tempMV.getAmount();

                int count = 0;

                System.out.println(s);

                if ( s.equals("FORWARD") ) {
                      for(int i = 0; i<= vlue ; i++)   
                           {                          
                        
                           m_vTranslate.x -= Math.sin(m_angle);
                           m_vTranslate.z -= Math.cos(m_angle);
                           
                           m_t3d.rotY( m_angle );                
                           m_t3d.setTranslation( m_vTranslate ); 
                           m_objTrans.setTransform( m_t3d );
                           
                           System.out.println(" forward : " + i);
                           
                           //pause
                           try{
                           Thread.sleep(300);
                           }catch(Exception e) {};
                           
                           }

                                            
                }
                else if ( s.equals("REVERSE") ) {
                        
                     for(int i = 0; i<= vlue ; i++)                   
                           {                                     

                           m_vTranslate.x += Math.sin(m_angle);
                           m_vTranslate.z += Math.cos(m_angle);

                           m_t3d.rotY( m_angle );               
                           m_t3d.setTranslation( m_vTranslate );
                           m_objTrans.setTransform( m_t3d );    
                           }
                }
                else if ( s.equals("RIGHT") )
                        {
                                            

                           m_angle -= Math.PI/2;

                           m_t3d.rotY( m_angle );               
                           m_t3d.setTranslation( m_vTranslate );
                           m_objTrans.setTransform( m_t3d );    
                           

                        }

                else if ( s.equals("LEFT") )
                        {
                          
                                                     
                        m_angle += Math.PI/2;

                        m_t3d.rotY( m_angle );               
                        m_t3d.setTranslation( m_vTranslate );
                        m_objTrans.setTransform( m_t3d );    
                           

                        }


                //m_t3d.rotY( m_angle );
                //t3d.setTranslation( m_vTranslate );
                //m_objTrans.setTransform( m_t3d );

        }
}

class Movement
{
   String move = "";
   int value =0;

   public Movement(String s, int i)
      {
       move = s;
       value = i;
      }

   public String getMovement()
      {
      return move;
      }

   public int getAmount()
      {
      return value;
      }


}

