import java.applet.Applet;
//import java.awt.*;
//import java.awt.event.* ;
import primitives.frames.*;
import primitives.machines.*;
import primitives.spaces.*;
public class SmallMachineProof extends Frames implements FramesListener {
	SmallMachine currentMachine = null;
	ConfigurationSpace currentSpace= null;
	int frameNumber = 0;
	final double  dalpha = 0.02  ;
	double alpha =0;
	double demoAlpha = 0.0;
	int sign = 1;
    boolean reachedEnd;
	public void start(){
		changeFrame(frameNumber);
	}
	public void stop(){
		super.stop();
		currentMachine = null;
		currentSpace = null;
	}
	public void changeFrame(int index){
		currentMachine = null;
		currentSpace = null;
			run = true;
		try{
			if(t!=null) t.stop();
		}catch(SecurityException e){}
		t = null;
		frameNumber = index;
		switch(index){
		case 0:{
				currentMachine = new SmallMachine(frames[0].drawArea.getSize());
				labels[1].setText("                   ");
			   };break;
		case 1:{
				currentMachine = new SmallMachineDemo(frames[0].drawArea.getSize());
			   	labels[1].setText("                    ");
			   };break;
		case 2:{
			currentMachine = new SmallMachineDemo(frames[0].drawArea.getSize());
			testRun();
			currentSpace = new ConfigurationSpace(frames[0].drawArea.getSize(),0,currentMachine);
			frames[1].drawArea.setCurrentObject(currentSpace);
			labels[1].setText("Configuration Space?");
			};break;
		case 3:{
//			label2.setText("Configuration Space");
			 currentMachine = new SmallMachineDemo(frames[0].drawArea.getSize());
			testRun();
			currentSpace = new ConfigurationSpace(frames[1].drawArea.getSize(),0,currentMachine);
			frames[1].drawArea.setCurrentObject(currentSpace);
			labels[1].setText("Configuration Space?");
			};break;
		case 4:{
//			label2.setText("Configuration Space");
			 currentMachine = new SmallMachineDemo(frames[0].drawArea.getSize());
			testRun();
			currentSpace = new ConfigurationSpace(frames[1].drawArea.getSize(),1,currentMachine);
			frames[1].drawArea.setCurrentObject(currentSpace); 
			sign = 1;
			labels[1].setText("Configuration Space?");
			};break;
		case 5:{
			currentMachine = new SmallMachine(frames[0].drawArea.getSize());
			testRun();
			currentSpace = new ConfigurationSpace(frames[1].drawArea.getSize(),2,currentMachine);
			labels[1].setText("Configuration Space ");
			 };break;
		}
		
		frames[0].drawArea.setCurrentObject(currentMachine);
		frames[1].drawArea.setCurrentObject(currentSpace);
		 alpha = 0;
		demoAlpha = 0;
		if (frameNumber==3) sign=-1;
		else sign = 1;
		reachedEnd=false;
		startThread();
	}
		
	private void testRun(){
		int i=0;
		int sign=1;
		double alpha=0;
		while(i<2){
			try{
				alpha = alpha+dalpha*sign;
				currentMachine.rotateJoint(alpha);
			}catch(Exception e){
			     	alpha = alpha-dalpha*sign;
					sign = sign*(-1);
					i++;
			}
		}
	}
 	public void changeFrames(){
		if ((frameNumber!=3)&&(frameNumber!=4)){
				try{
					if (currentMachine!=null)	currentMachine.rotateJoint(alpha);
					frames[0].drawArea.repaint();
					alpha = alpha+dalpha*sign;
					demoAlpha = demoAlpha+dalpha;
					if (currentSpace!=null){
						if (frameNumber!=5) currentSpace.rotateJoint(alpha);
						else currentSpace.rotateJoint(demoAlpha);
					}
					frames[1].drawArea.repaint();
					}catch(MachineException e){
						currentMachine.reachEnd();
						frames[0].drawArea.repaint();
			     		alpha = alpha-dalpha*sign;
						demoAlpha = demoAlpha-dalpha;
						if (frameNumber==5)	currentMachine.switchBend();
						sign = sign*(-1);
					}
		}else{ 
				 try{
					if (!reachedEnd) currentMachine.rotateJoint(alpha);
					frames[0].drawArea.repaint();
					alpha = alpha+dalpha*sign;
					currentSpace.rotateJoint(alpha);
					frames[1].drawArea.repaint();
					}catch(MachineException e){
						reachedEnd = true;
						currentMachine.reachEnd();
			     		currentSpace = new Demo(frames[1].drawArea.getSize(),frameNumber);
						frames[1].drawArea.setCurrentObject(currentSpace);
					}
		}
	}
}
