package carbadges;

import java.lang.Math;
import javafx.animation.Interpolator;
import javafx.animation.Timeline;
import javafx.geometry.Point2D;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Transform;

public class Chrysler extends CustomNode {

	def stageSize = 250.0;
	def centerStage = stageSize / 2;

	function rotateRadialPoint(angle:Number, r: Number) : Point2D {
		// rotate point (0, -r) about point (0,0) by the specified degrees
		var radians = Math.toRadians(angle);
		var p = Point2D {
			x: r * Math.sin(radians);
			y: -r * Math.cos(radians);
		};
		return p;
	}

	function makeRegularPolygon(n:Number, radius: Number): Number[] {
		// make the points for a regular polygon (same length sides and interior angles)
		var pts : Number[] = [];
		var angle : Number = 360 / n;
		for(i in [0..
		n - 1]) {
			var p : Point2D = rotateRadialPoint(i * angle, radius);
			insert p.x into pts;
			insert p.y into pts;
		}
		return pts;
	}

	function makeStar(pointsNumber:Number, innerRadius:Number, outerRadius:Number) : Number[] {
		// make the points for a star
		var pts : Number[] = [];
		var n = (2 * pointsNumber) - 1;
		var delta = Math.toRadians(360.0 / (2 * pointsNumber));
		for(i in [0..n]) {
			var y =
			if(i mod 2 == 0) then -outerRadius else -innerRadius;
			var angle = delta * i;
			var newX = y * Math.sin(angle);
			var newY = y * Math.cos(angle);
			insert newX into pts;
			insert newY into pts;
		}
		return pts;
	}

	def numPoints = 5;
	def radius = 100.0; // radius for poly
	var r = 0.0; // radius for star
	var polyPoints = makeRegularPolygon(numPoints, radius);
	var starPoints = bind makeStar(numPoints, 8, r);


	public override function create(): Node {
		var numPoints = 5;
		return Group {
			content: [
				Rectangle {
					width: stageSize
					height: stageSize
					fill: Color.BLACK
				}
				Group {
					content: [
						Polygon {
							points: polyPoints
							translateX: centerStage
							translateY: centerStage
							fill: null
							stroke: Color.SILVER
							strokeWidth: 6
						}
						Polygon {
							points: bind starPoints
							translateX: centerStage
							translateY: centerStage
							fill: Color.SILVER
						}
					]
					transforms: bind Transform.rotate(rotAngle, centerStage, centerStage)
				} // group
			] // return group content
		}; // return group
	} // create

	var rotAngle = 0.0;

	public var timeline:Timeline = Timeline {
		keyFrames: [
			at (0s) {r => 0.0;}
			at (3s) {rotAngle => 0.0; r => 100.0;}
			at (12s) {rotAngle => 360.0 * 15 tween Interpolator.EASEBOTH}
		]
	}
}