using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;

using CategoryTheory;
using DiagramUI;
using DataPerformer;
using GeneralLinearMethod;
using Regression;

namespace DataPerformerUI
{
	public class RegressionAliasPanel : Panel
	{
		ComboBox cb = new ComboBox();
		TextBox dispEdi = new TextBox();
		TextBox deltaEdi = new TextBox();
		public RegressionAliasPanel(List<string> list)
		{
			foreach (string s in list)
			{
				cb.Items.Add(s);
			}
			Label l = new Label();
			l.Text = PureDesktop.GetResourceString("Parameter");
			l.Left = 10;
			l.Top = 10;
			Controls.Add(l);
			cb.Left = l.Left;
			cb.Top = 10 + l.Top + l.Height;
			Controls.Add(cb);
			l = new Label();
			l.Text = PureDesktop.GetResourceString("Dispersion");
			l.Left = cb.Left;
			l.Top = cb.Top + cb.Height + 10;
			Controls.Add(l);
			dispEdi.Top = l.Top + l.Height + 10;
			dispEdi.Left = l.Left;
			dispEdi.Text = "0";
			Controls.Add(dispEdi);
			l = new Label();
			l.Text = PureDesktop.GetResourceString("Delta");
			l.Left = cb.Left;
			l.Top = dispEdi.Top + dispEdi.Height + 10;
			Controls.Add(l);
			deltaEdi.Top = l.Top + l.Height + 10;
			deltaEdi.Left = l.Left;
			deltaEdi.Text = "1e-5";
			Controls.Add(deltaEdi);
			Height = deltaEdi.Top + deltaEdi.Height + 10;
		}

		public object[] Object
		{
			get
			{
				object[] o = new object[3];
				o[0] = cb.SelectedItem.ToString();
				o[1] = Double.Parse(dispEdi.Text);
				o[2] = Double.Parse(deltaEdi.Text);
				return o;
			}
			set
			{
				string n = value[0] as string;
				double disp = (double) value[1];
				double delta = (double) value[2];
				dispEdi.Text = disp + "";
				deltaEdi.Text = delta + "";
				for (int i = 0; i < cb.Items.Count; i++)
				{
					if (n.Equals(cb.Items[i].ToString()))
					{
						cb.SelectedIndex = i;
						break;
					}
				}
			}
		}
	}

	public class RegessionAliasMeasurePanel : Panel
	{
		private IMeasurements meas;
		private ArrayList num = new ArrayList();
		public RegessionAliasMeasurePanel(IMeasurements meas)
		{
			this.meas = meas;
			Control panel = HeaderControl.Object.GetHeaderControl(meas);
			panel.Top = 0;
			panel.Left = 0;
			Controls.Add(panel);
			int y = panel.Height + 10;
			for (int i = 0; i < meas.Count; i++)
			{
				
				IMeasure m = meas[i];
				Label l = new Label();
				l.Text = m.Name;
				l.Top = y;
				l.Left = 10;
				Controls.Add(l);
				y = l.Top + l.Height + 5;
				NumericUpDown n = new NumericUpDown();
				n.Minimum = -1;
				n.Value = -1;
				n.Left = 10;
				n.Top = y;
				y += n.Height + 20;
				Controls.Add(n);
				num.Add(n);
			}
			Height = y;
		}

		public Hashtable Table
		{
			get
			{
				Hashtable t = new Hashtable(); 
				IAssociatedObject ao = meas as IAssociatedObject;
				INamedComponent nc = ao.Object as INamedComponent;
				string name = nc.Name;
				for (int i = 0; i < meas.Count; i++)
				{
					NumericUpDown n = num[i] as NumericUpDown;
					n.Minimum = -1;
					int no = (int) n.Value;
					if (no < 0)
					{
						continue;
					}
					t[no] = name + "." + meas[i].Name;
				}
				return t;
			}
			set
			{
				IAssociatedObject ao = meas as IAssociatedObject;
				INamedComponent nc = ao.Object as INamedComponent;
				string name = nc.Name;
				for (int i = 0; i < value.Count; i++)
				{
					string s = value[i] as string;
					int np = s.LastIndexOf(".");
					if (!name.Equals(s.Substring(0, np)))
					{
						continue;
					}
					string suffix = s.Substring(np + 1);
					for (int j = 0; j < meas.Count; j++)
					{
						if (meas[j].Name.Equals(suffix))
						{
							NumericUpDown n = num[j] as NumericUpDown;
							n.Value = i;
							break;
						}
					}
				}
			}
		}

	}

	public class RegressionSelectionPanel : Panel
	{
		IStructuredSelectionCollection s;
		Hashtable controls = new Hashtable();
		AliasRegression reg;
		string name;
		public RegressionSelectionPanel(AliasRegression reg, IStructuredSelectionCollection s)
		{
			this.s = s;
			this.reg = reg;
			IAssociatedObject ao = s as IAssociatedObject;
			IObjectLabel label = ao.Object as IObjectLabel;
			name = label.RootName;//NamedComponent.GetText(label);
			Control c = new ObjectPanel(label);
			c.Left = 0;
			c.Top = 0;
			Controls.Add(c);
			int y = c.Height;
			for (int i = 0; i < s.Count; i++)
			{
				IStructuredSelection sel = s[i];
				Label l = new Label();
				l.Text = sel.Name;
				l.Top = y + 10;
				l.Left = 10;
				Controls.Add(l);
				y = l.Top + l.Height;
				NumericUpDown n = new NumericUpDown();
				n.Minimum = -1;
				n.Value = -1;
				n.Left = 10;
				n.Top = y + 10;
				y = n.Top + n.Height + 20;
				Controls.Add(n);
				controls[n] = PureDesktop.GetRelativeName(reg, s as IAssociatedObject) + "." + sel.Name;
			}
			Height = y;
		}



		public Hashtable Table
		{
			set
			{
				foreach (int i in value.Keys)
				{
					string nam = value[i] as string;
					foreach (NumericUpDown nup in controls.Keys)
					{
						string str = controls[nup] as string;
						if (str.Equals(nam))
						{
							nup.Value = i;
						}
					}
				}
			}
		}

		public void Fill(Hashtable table)
		{
			foreach (NumericUpDown nup in controls.Keys)
			{
				int i = (int) nup.Value;
				if (i < 0)
				{
					continue;
				}
				if (table.ContainsKey(i))
				{
					throw new Exception("More than one secection with equal number");
				}
				table[i] = controls[nup];
			}
		}

	}
}
