﻿//----------------------------------------------//
// Gamelogic Grids                              //
// http://www.gamelogic.co.za                   //
// Copyright (c) 2014 Gamelogic (Pty) Ltd       //
//----------------------------------------------//

using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Gamelogic.Grids
{
	public class ArchimedianSpiralMap : AbstractMap<LinePoint>
	{
		private const int Offset = 20;
		private const float Radius = 7f; 
		private const float SampleFrequency = 2 / Radius;
		
		private readonly Vector2[] lookUpWorld;
		private readonly LinePoint[] lookUpGrid;
		private readonly LinePoint notInGrid;
		

		public ArchimedianSpiralMap(Vector2 cellDimensions, IGridSpace<LinePoint> grid)
			: base(cellDimensions)
		{
			lookUpWorld = grid.Select(p => this[p]).ToArray();
			lookUpGrid = grid.ToArray();
			notInGrid = grid.Last().Translate(LinePoint.Right);
		}

		public override LinePoint RawWorldToGrid(Vector2 worldPoint)
		{
			for (int i = 0; i < lookUpWorld.Length; i++)
			{
				if ((lookUpWorld[i] - worldPoint).magnitude < (cellDimensions/2.5f).magnitude)
				{
					return lookUpGrid[i];
				}
			}

			return notInGrid;
		}

		public override Vector2 GridToWorld(LinePoint gridPoint)
		{
			var t = Offset + gridPoint.X * cellDimensions.x * SampleFrequency;
			var s = Mathf.Sign(t) * Mathf.Pow(Mathf.Abs(t), .5f);
			var x = Radius * s * Mathf.Cos(s);
			var y = Radius * s * Mathf.Sin(s);

			return new Vector2(x, y);
		}
	}
}