package primitives.spaces;
import java.awt.*;
import primitives.machines.*;
import primitives.geomtry.*;
public class ConfigurationSpace implements MachineListener{
	private Point[] states;
	private Dimension d;
	private int  r;
	private int full;
	private SmallMachine dual;
	private double alpha;
	public ConfigurationSpace(){}
	public ConfigurationSpace(Dimension d,int full,SmallMachine dual){
		states = new Point[2];
		this.r = Math.min(d.width,d.height)/3;
		this.full = full;
		this.dual = dual;
		this.d = d;
		states[0] = Geomtry.getPointByVector(new Coordinate(d.width/2,d.height/3),r,0).toPoint();
		states[1] = Geomtry.getPointByVector(new Coordinate(d.width/2,d.height*2/3),r,0).toPoint();

	
	}
	public void finalize()throws Throwable{
		states = null;
		d = null;
		dual = null;
	}
	public void rotateJoint(double alpha) throws MachineException{
		if(full<2){
			alpha = Math.PI*r*(alpha-dual.alphaRange[0])/(dual.alphaRange[1]-dual.alphaRange[0]);
			this.alpha = alpha+(d.width-Math.PI*r)/2;															 
			states[0].move((int)this.alpha,d.height/2-r);
			states[1].move((int)this.alpha,d.height/2+r);
		}else{
			alpha = Math.PI*(alpha-dual.alphaRange[0])/(dual.alphaRange[1]-dual.alphaRange[0]);
			this.alpha = alpha+Math.PI;															 
			states[0] = Geomtry.getPointByVector(new Coordinate(d.width/2,d.height/2),r,this.alpha).toPoint();
		}
	}
	public void redraw(Graphics g){
		g.setColor(Color.black);
		if (full<2){
				if (full==1) g.drawArc(d.width/2-r,d.height/2-r,2*r,2*r,90,180);
				g.drawLine((int)(d.width/2-(1-full)*Math.PI*r/2),d.height/2-r,(int)(d.width/2+Math.PI*r/2),d.height/2-r);
				g.drawLine((int)(d.width/2-(1-full)*Math.PI*r/2),d.height/2+r,(int)(d.width/2+Math.PI*r/2),d.height/2+r);
				g.setColor(Color.magenta);
			//	g.fillOval(states[0].x-2,states[0].y-2,5,5);
				Geomtry.drawJoint(g,states[0]);
				g.setColor(Color.yellow);
			//	g.fillOval(states[1].x-2,states[1].y-2,5,5);
				Geomtry.drawJoint(g,states[1]);
			}else{
			g.drawOval(d.width/2-r,d.height/2-r,2*r,2*r);
			g.setColor(Color.green);
		//	g.fillOval(states[0].x-2,states[0].y-2,5,5);
			Geomtry.drawJoint(g,states[0]);
		}
	}
}
