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

namespace MoreMountains.Tools
{
	public class MMPlotterGenerator : MonoBehaviour
	{
		public MMPlotter PlotterPrefab;
        
		public Vector2 Spacing;
		public float VerticalOddSpacing;
		public int RowLength;

		[Header("Materials")]

		public Material LinearMaterial;
		public Material QuadraticMaterial;
		public Material CubicMaterial;
		public Material QuarticMaterial;
		public Material QuinticMaterial;
		public Material SinusoidalMaterial;
		public Material BounceMaterial;
		public Material OverheadMaterial;
		public Material ExponentialMaterial;
		public Material ElasticMaterial;
		public Material CircularMaterial;

		protected Vector2 _position;

		[MMInspectorButton("GeneratePlotters")]
		public bool GeneratePlottersButton;

		protected virtual void Awake()
		{
			Time.timeScale = 0f;

			GeneratePlotters();
		}

		protected virtual void GeneratePlotters()
		{
			this.transform.MMDestroyAllChildren();

			BindingFlags flags = BindingFlags.Public | BindingFlags.Static;
			MethodInfo[] methods = typeof(MMTweenDefinitions).GetMethods(flags);

			int row = 0;
			int column = 0;
			float yCoordinate = 0;

			for (int i=0; i < methods.Length; i++)
			{
				_position.x = column * Spacing.x;
                

				_position.y = yCoordinate;
                
				MMPlotter plotter = Instantiate(PlotterPrefab);
				plotter.transform.SetParent(this.transform);
				plotter.transform.localPosition = _position;
				plotter.TweenMethodIndex = i;
				string tweenName = plotter.TweenName(plotter.TweenMethodIndex);
				plotter.gameObject.name = tweenName;

				Material newMaterial = LinearMaterial;
				if (tweenName.Contains("Linear")) { newMaterial = LinearMaterial; }
				if (tweenName.Contains("Quadratic")) { newMaterial = QuadraticMaterial; }
				if (tweenName.Contains("Cubic")) { newMaterial = CubicMaterial; }
				if (tweenName.Contains("Quartic")) { newMaterial = QuarticMaterial; }
				if (tweenName.Contains("Quintic")) { newMaterial = QuinticMaterial; }
				if (tweenName.Contains("Sinusoidal")) { newMaterial = SinusoidalMaterial; }
				if (tweenName.Contains("Bounce")) { newMaterial = BounceMaterial; }
				if (tweenName.Contains("Overhead")) { newMaterial = OverheadMaterial; }
				if (tweenName.Contains("Exponential")) { newMaterial = ExponentialMaterial; }
				if (tweenName.Contains("Elastic")) { newMaterial = ElasticMaterial; }
				if (tweenName.Contains("Circular")) { newMaterial = CircularMaterial; }

				plotter.SetMaterial(newMaterial);
				plotter.GetMethodsList();
				plotter.DrawGraph();

				if (column >= RowLength - 1)
				{
					column = 0;                    
					row++;
					if (row % 2 == 0)
					{
						yCoordinate += Spacing.y + VerticalOddSpacing;
					}
					else
					{
						yCoordinate += Spacing.y;
					}
				}
				else
				{
					column++;
				}
			}
		}

	}
}