using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Drawing;

namespace Drawing.Examples {
	[HelpURL("http://arongranberg.com/aline/documentation/stable/gizmocharacterexample.html")]
	public class GizmoCharacterExample : MonoBehaviourGizmos {
		public Color gizmoColor = new Color(1.0f, 88/255f, 85/255f);
		public Color gizmoColor2 = new Color(79/255f, 204/255f, 237/255f);

		public float movementNoiseScale = 0.2f;
		public float startPointAttractionStrength = 0.05f;
		public int futurePathPlotSteps = 100;
		public int plotStartStep = 10;
		public int plotEveryNSteps = 10;

		float seed;
		Vector3 startPosition;
		void Start () {
			seed = Random.value * 1000;
			startPosition = transform.position;
		}

		Vector3 GetSmoothRandomVelocity (float time, Vector3 position) {
			// Use perlin noise to get a smoothly varying vector
			float t = time * movementNoiseScale + seed;
			var dx = 2*Mathf.PerlinNoise(t, t + 5341.23145f) - 1;
			var dy = 2*Mathf.PerlinNoise(t + 92.9842f, -t + 231.85145f) - 1;
			var velocity = new Vector3(dx, 0, dy);

			// Make a weak attractor to the start position of the agent. To make sure the agent doesn't move too far out of view
			velocity += (startPosition - position) * startPointAttractionStrength;
			velocity.y = 0;
			return velocity;
		}

		void PlotFuturePath (float time, Vector3 position) {
			float dt = 0.05f;

			for (int i = 0; i < futurePathPlotSteps; i++) {
				var v = GetSmoothRandomVelocity(time + i*dt, position);

				var idx = i - plotStartStep;
				if (idx >= 0 && idx % plotEveryNSteps == 0) {
					Draw.Arrowhead(position, v, 0.1f, gizmoColor);
				}
				position += v.normalized * dt;
			}
		}

		// Update is called once per frame
		void Update () {
			PlotFuturePath(Time.time, transform.position);
			Vector3 velocity = GetSmoothRandomVelocity(Time.time, transform.position);
			transform.rotation = Quaternion.LookRotation(velocity);
			transform.position += transform.forward * Time.deltaTime;
		}

		public override void DrawGizmos () {
			using (Draw.InLocalSpace(transform)) {
				Draw.WireCylinder(Vector3.zero, Vector3.up, 2, 0.5f, gizmoColor);
				Draw.ArrowheadArc(Vector3.zero, Vector3.forward, 0.55f, gizmoColor);
				Draw.Label2D(Vector3.zero, gameObject.name, 14, LabelAlignment.TopCenter.withPixelOffset(0, -20), gizmoColor2);
			}
		}
	}
}
