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

using UnityEngine;

namespace Gamelogic.Grids
{
/**
	@since Grids 1.8
*/

	public partial struct LinePoint : IGridPoint<LinePoint>, IVectorPoint<LinePoint>
	{
		public static readonly LinePoint Zero = 0;

		public static readonly LinePoint Left = -1;
		public static readonly LinePoint Right = 1;


		private readonly int n;

		public LinePoint(int n)
		{
			this.n = n;
		}

		public bool Equals(LinePoint other)
		{
			return n == other.n;
		}

		public int DistanceFrom(LinePoint other)
		{
			return Mathf.Abs(n - other.n);
		}

		public static implicit operator LinePoint(int n)
		{
			return new LinePoint(n);
		}

		public static implicit operator int(LinePoint point)
		{
			return point.n;
		}

		public LinePoint Translate(LinePoint vector)
		{
			return n + vector.n;
		}

		public LinePoint Negate()
		{
			return -n;
		}

		public LinePoint Subtract(LinePoint vector)
		{
			return n - vector.n;
		}

		public LinePoint MoveBy(LinePoint splicedVector)
		{
			return Translate(splicedVector);
		}

		public LinePoint MoveBackBy(LinePoint splicedVector)
		{
			return Subtract(splicedVector);
		}

		public int X
		{
			get
			{
				return n;
			}
		}

		public int Y
		{
			get
			{
				return 0;
			}
		}

		public LinePoint ScaleDown(int r)
		{
			return Mathi.Div(n, r);
		}

		public LinePoint ScaleUp(int r)
		{
			return n*r;
		}

		public LinePoint Div(LinePoint other)
		{
			return Mathi.Div(n, other.n);
		}

		public LinePoint Mod(LinePoint other)
		{
			return Mathi.Mod(n, other.n);
		}

		public LinePoint Mul(LinePoint other)
		{
			return n*other.n;
		}

		public int Magnitude()
		{
			return Mathf.Abs(n);
		}

		public int GetColor(int colorCount)
		{
			return Mathi.Mod(n, colorCount);
		}
	}
}