import java.awt.*;
import java.applet.Applet;
import primitives.machines.*;
import primitives.geomtry.*;
import primitives.frames.*;


public class StraightLineDemo extends Frames implements MachineListener {
 	
	int ellapsedTime;
	final double  dalpha =0.008;
	int direction;
	double alpha ;
	boolean switched;
	public StraightLineMachine machine = null;
	boolean demo; 
	public void init(){
		super.init();
		Font f = frames[0].drawArea.getFont();
		frames[0].drawArea.setFont(new Font(f.getName(),f.getStyle(),f.getSize()+3));
	}
	public void start() {
			run = true;
		ellapsedTime = 0;
		direction = -1;
		alpha = Math.PI*5/8;
		switched=false;
		demo = (getParam("isDemo",1)==1);
		machine = new StraightLineMachine(frames[0].drawArea.getSize(),demo);
		machine.switchLeader();
		if (demo) frames[0].drawArea.setCurrentObject(this);
		else frames[0].drawArea.setCurrentObject(machine);	
		startThread();
    }
	protected void changeFrames(){
		try{
				alpha = alpha+dalpha*direction;
				machine.moveMachine(alpha);
				frames[0].drawArea.repaint();
				if ((direction==1)&&(alpha>Math.PI/2)&&(!switched)){
					switched=true;
					alpha=machine.switchLeader();
				}else if ((direction==-1)&&(alpha<Math.PI/2)&&(switched)){
					switched=false;
					alpha=machine.switchLeader();
				}
		}catch(MachineException e){
					alpha = alpha-dalpha*direction;
					direction = direction*(-1);
		}
	}
	static final String lJoint = "<<-- Joint";
	static final String lAnchor = "<<-- Anchor";
	static final String lBar = "<<-- Rigid Bar";
    FontMetrics fm = null;
	public void redraw(Graphics g){
		
		if (fm==null)fm = g.getFontMetrics();
		if(machine!=null){
			Point temp	 ;
	//		machine.update(g);
			g.setColor(Color.red);
			int hoffset = fm.getMaxAscent();
			if (machine.bigCenter.y<hoffset) hoffset = hoffset-machine.bigCenter.y;
			else hoffset = 0;
			g.drawString(lAnchor,machine.bigCenter.x+20,machine.bigCenter.y+hoffset);
			   Color color = Color.green;								  
	//		machine.redraw(g);
		   color= color.darker();
		   g.setColor( color.darker());
		   temp = Geomtry.getMidPoint(machine.radialJoints[0].toCoordinate(),machine.bigCenter.toCoordinate(),0.2).toPoint();
		   if (machine.leaderJoint==1)	{
			   g.drawString(lJoint,machine.radialJoints[0].x+10,machine.radialJoints[0].y+5);
			   g.setColor(Color.black);
			   g.drawString(lBar,temp.x+15,temp.y);
		   }else{
			   
			   int offset = fm.stringWidth(joint+right);
			   g.drawString(joint+right,machine.radialJoints[0].x-offset,machine.radialJoints[0].y+5);
		  	   g.setColor(Color.black);
			   offset = fm.stringWidth(bar+right);
			   g.drawString(bar+right,temp.x-offset,temp.y);
		   }
	  	   machine.redraw(g);
		}
 	}
	static final String joint = " Joint ";
	static final String bar = " Rigid Bar ";
	static final String right = "-->>  ";


	public void stop(){
		super.stop();
		machine = null;
		fm = null;
	}
}
