﻿#define PRO

using UnityEngine;
using System.Collections;

namespace ProGrids
{
	public enum Axis {
		None = 0x0,
		X = 0x1,
		Y = 0x2,
		Z = 0x4,
		NegX = 0x8,
		NegY = 0x16,
		NegZ = 0x32
	}

	public enum SnapUnit {
		Meter,
		#if PRO
		Centimeter,
		Millimeter,
		Inch,
		Foot,
		Yard,
		Parsec
		#endif
	}

	public static class pg_Enum
	{
		/**
		 * Multiplies a Vector3 using the inverse value of an axis (eg, Axis.Y becomes Vector3(1, 0, 1) )
		 */
		public static Vector3 InverseAxisMask(Vector3 v, Axis axis)
		{
			switch(axis)
			{
				case Axis.X:
				case Axis.NegX:
					return Vector3.Scale(v, new Vector3(0f, 1f, 1f));
				
				case Axis.Y:
				case Axis.NegY:
					return Vector3.Scale(v, new Vector3(1f, 0f, 1f));

				case Axis.Z:
				case Axis.NegZ:
					return Vector3.Scale(v, new Vector3(1f, 1f, 0f));

				default:
					return v;
			}
		}

		public static Vector3 AxisMask(Vector3 v, Axis axis)
		{
			switch(axis)
			{
				case Axis.X:
				case Axis.NegX:
					return Vector3.Scale(v, new Vector3(1f, 0f, 0f));
				
				case Axis.Y:
				case Axis.NegY:
					return Vector3.Scale(v, new Vector3(0f, 1f, 0f));

				case Axis.Z:
				case Axis.NegZ:
					return Vector3.Scale(v, new Vector3(0f, 0f, 1f));

				default:
					return v;
			}
		}

		public static float SnapUnitValue(SnapUnit su)
		{
			switch(su)
			{
				case SnapUnit.Meter:
					return pg_Constant.METER;
#if PRO
				case SnapUnit.Centimeter:
					return pg_Constant.CENTIMETER;
				case SnapUnit.Millimeter:
					return pg_Constant.MILLIMETER;
				case SnapUnit.Inch:
					return pg_Constant.INCH;
				case SnapUnit.Foot:
					return pg_Constant.FOOT;
				case SnapUnit.Yard:
					return pg_Constant.YARD;
				case SnapUnit.Parsec:
					return pg_Constant.PARSEC;
#endif
				default:
					return pg_Constant.METER;
			}
		}
	}
}