package automatvgi.drawing;

import java.awt.Graphics;
import java.util.HashMap;


import automatvgi.Projection;
import automatvgi.components.EdgeComponent;
import automatvgi.drawing.tools.DrawShape;
import automatvgi.tools.Point;
import automatvgi.tools.Vector;


public class DrawEdge {
	public double alpha=0.5;
	private String id;
	private DrawEdge(String s, double a){
		alpha=a;
		id=s;
		instances.put(s, this);
	}
	
	private static HashMap<String, DrawEdge> instances= new HashMap<String, DrawEdge>();
	
	static{
		new DrawEdge("EdgeL",0);
		new DrawEdge("ArcL",0.5);		
	}
	
	public static DrawEdge[] getDrawTransitionArray(){
		//return (DrawTransition[])(instances.values().toArray());
		DrawEdge[] tab= new DrawEdge[instances.size()];
		int i=0;
		for(DrawEdge dt : instances.values())
			tab[i++]=dt;
		return tab;
	}
	
	public static DrawEdge getDrawTransition(String s){
		DrawEdge tr=instances.get(s);
		if(tr==null){
			tr=new DrawEdge(s,0);
		}
		return tr;
	}
	
	
	
	
	public void drawTransition(EdgeComponent tc, Graphics g, Projection j){
		Point p=tc.getSrc().getCenter(), q=tc.getDst().getCenter();
		int a=j.getAbs(p),b=j.getOrd(p),c,d;
		double rp=tc.getSrc().getDraw().getRadius();
		double rq=tc.getDst().getDraw().getRadius();
		double t;Point r=null;
		for(t=0; t<1;t+=.01){
			r=(new Point(t,alpha*t*(1-t))).convert(p, q);
			c=j.getAbs(r);
			d=j.getOrd(r);
			if((new Vector(q,r)).norm()<=rq) break;
			if((new Vector(p,r)).norm()>rp)
				DrawShape.drawLine(g,a,b,c,d,j.mmToPix(1),tc.getLineColor().getColor());
			a=c;b=d;
		}
		if(r!=null){
			t+=.01;
			Point sr=(new Point(t,alpha*t*(1-t))).convert(p, q);
			Vector v=new Vector(r,sr);
			v.scal(.8*rq/v.norm());
			g.setColor(tc.getLineColor().getColor());
			DrawShape.drawArrow(g, r, v, j);
		}
	    if(tc.getLabel()!=null){
	    	r=(new Point(.5,alpha/4)).convert(p,q);
	    	Vector vr=(new Vector(p,q));
	    	vr.rot(-Math.PI/2);
	    	vr.scal(.5/vr.norm());
	    	r=r.addTo(vr);
			//r=(new Point(.4,-(alpha+.2)*.16)).convert(p, q);
	    	g.setColor(tc.getLabelColor().getColor());
	    	DrawLabel.draw(tc.getLabel(),j.getAbs(r),j.getOrd(r),g,j);
	    }
	}

	@Override
	public String toString() {
		return id;
	}
}
