package com.fold1.eulumdat.tools.editors.graph;

import java.awt.BasicStroke;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import com.fold1.data.Eulumdat2;
import com.fold1.data.IntensityCalculator;
import com.fold1.data.Symmetry;
import com.fold1.data.ThreePoints;
import com.fold1.chart.DiagramColorFontSizeSupplier;
import com.fold1.util.NumberOutput;

public class CGammaDiagrammer extends AbstractDiagrammer {

	private static final double SCALE_START = 0;
	private Object scaleStep;

	@Override
	public void awtPaint(Graphics2D g2d, int width, int height) {
		String label;

		if (null == eulumdat) {
			return;
		}
		IntensityCalculator temp = eulumdat.getIntensityCalculatorStrategy();
		eulumdat.setIntensityCalculatorStrategy(new ThreePoints(eulumdat));
		// draw coordinate axis
		prepareDiagram(g2d, height, height);

		g2d.setFont(new Font(dcfs.getFontName(), Font.PLAIN, size / 20));
		g2d.translate(INSET / 2, INSET / 2);

		// process the EULUMDAT to two or four line sets
		CGammaDrawer drawer = new CGammaDrawer(this, eulumdat);

		g2d.setColor(dcfs.getTextColor());
		label = "I (cd/klm)";
		g2d.drawString(label, 10, size - 10);

		g2d.setColor(dcfs.getTextColor());
		label = "\u03B7 = " + NumberOutput.digits(eulumdat.getEfficacy(), 1)
				+ "%";
		g2d.drawString(label,
				size - 10 - PhotometricJava2dDiagram.stringLength(g2d, label),
				size - 10);

		g2d.translate(size / 2, size / 2);
		g2d.scale(size / drawer.getScale(),
				size / drawer.getScale());
		g2d.scale(0.9, 0.9);

		double dx = 0.5 * drawer.getScaleX() - drawer.getMaxX();
		double dy = 0.5 * drawer.getScaleY() - drawer.getMaxY();
		g2d.translate(dx, dy);

		// Draw axis
		g2d.setColor(dcfs.getAxisColor());
		g2d.setStroke(new BasicStroke((float) (2.0f / drawer.getScale())));
		int axis = (int) drawer.getScale();
		g2d.drawLine(-axis, 0, axis, 0);
		g2d.drawLine(0, -axis, 0, axis);

		// TODO set scaleStep to arrive at a reasonable number of values,
		// bug#184
		scaleStep = drawer.getScaleStep(SCALE_START);

		// draw scales
		int nbOfSlices = 24;
		int len = 2 * (int) drawer.getScale();
		for (int i = 0; i < nbOfSlices; i++) {
			g2d.setColor(dcfs.getAxisColor());
			g2d.drawLine((int) scaleStep, 0, len, 0);
			g2d.rotate(-2 * Math.PI / nbOfSlices);
		}

		double scale = size / (0.9 * 20 * g2d.getTransform().getScaleX());
		g2d.setFont(new Font(dcfs.getFontName(), Font.PLAIN, (int) scale));
		double s = 0.0;
		do {
			g2d.setColor(dcfs.getAxisColor());
			Ellipse2D circle = new Ellipse2D.Double(-s, -s, 2 * s, 2 * s);
			g2d.draw(circle);
			g2d.setColor(dcfs.getTextColor());
			PhotometricJava2dDiagram.centerString(g2d,
					NumberOutput.digits(s, 0), 0f, (float) (s), true);
			PhotometricJava2dDiagram.centerString(g2d,
					NumberOutput.digits(s, 0), 0f,
					(float) (-s), true);
			s += scaleStep;
		} while (s < drawer.getScale());
		Ellipse2D circle = new Ellipse2D.Double(-s, -s, 2 * s, 2 * s);
		g2d.draw(circle);

		// draw curve!
		g2d.setColor(dcfs.getPlaneC0C180Color());
		g2d.fillPolygon(drawer.getC0C180Polygon());

		if (!(eulumdat.getIsym() == Symmetry.ROTATION)) {
			g2d.setColor(dcfs.getPlaneC90C270Color());
			g2d.fillPolygon(drawer.getC90C270Polygon());
		}

		eulumdat.setIntensityCalculatorStrategy(temp);
		drawer.dispose();

	}

	/**
	 * @param eulumdat
	 * @param dcfs
	 */
	public CGammaDiagrammer(Eulumdat2 eulumdat,
			DiagramColorFontSizeSupplier dcfs) {
		super(eulumdat, dcfs);
		// TODO Auto-generated constructor stub
	}

}
