package org.openpixi.pixi.ui.util.yaml;

import java.awt.Color;
import java.lang.reflect.Field;

import org.openpixi.pixi.physics.Settings;
import org.openpixi.pixi.physics.particles.ParticleFull;

public class YamlParticle {
	public Double x;
	public Double y;
	public Double r;
	public Double vx;
	public Double vy;
	public Double m;
	public Double q;
	public String color;

	public void applyTo(Settings settings) {

		ParticleFull p = getParticle();

		settings.addParticle(p);
	}

	/**
	 * Creates a new particle and applies the settings from the
	 * YAML document to it.
	 * @return new particle
	 */
	public ParticleFull getParticle() {
		ParticleFull p = new ParticleFull();

		if (x != null) {
			p.setX(x);
		}

		if (y != null) {
			p.setY(y);
		}

		if (r != null) {
			p.setRadius(r);
		}

		if (vx != null) {
			p.setVx(vx);
		}

		if (vy != null) {
			p.setVy(vy);
		}

		if (m != null) {
			p.setMass(m);
		}

		if (q != null) {
			p.setCharge(q);
		}

		if (color != null) {
			p.setColor(getColorFromString(color));
		}
		return p;
	}

	/**
	 * Convert a color string from the YAML file into Java color.
	 * @param colorstring This can be a name (e.g. "red", "blue", ...),
	 * a HEX code (e.g. "FFFFFF"), or "random".
	 * @return
	 */
	static private Color getColorFromString(String colorstring) {
		// Default is black
		Color c = null;

		// Check if it is a Java string (e.g. "blue", "red", ...)
		try {
			// Access Color.blue, Color.red, ... by reflection:
			Field field = Color.class.getField(colorstring);
			c = (Color)field.get(null);
		} catch (NoSuchFieldException e) {
		} catch (IllegalAccessException e) {
		}

		if (c == null) {
			// Check if it is a HEX color code (e.g. "FFFFFF")
			try {
				c = Color.decode("#" + colorstring);
			} catch (NumberFormatException e) {
			}
		}

		if (colorstring.equals("random")) {
			// Use random color
			c = new Color((int)(Math.random() * 0x1000000));
		}

		if (c == null) {
			// Fallback color
			c = Color.black;
		}
		return c;
	}

}
