using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace ViewComponents
{
	public partial class MyTreeView : UserControl
	{
		public MyTreeView()
		{
			InitializeComponent();
		}
		private List<(string, bool)> hierarchy = new List<(string, bool)>();

		public int SelectedNodeIndex
		{
			get
			{
				return treeView.SelectedNode?.Index ?? -1;
			}
			set
			{
				if (treeView.SelectedNode == null) treeView.SelectedNode = value >= 0 && value < treeView.Nodes.Count ? treeView.Nodes[value] : treeView.SelectedNode;
				else treeView.SelectedNode = value >= 0 && value < treeView.SelectedNode.Nodes.Count ? treeView.SelectedNode.Nodes[value] : treeView.SelectedNode;
			}
		}

		public T? getSelecetedNodeValue<T>()
		{
			if (treeView.SelectedNode == null || treeView.SelectedNode.Nodes.Count > 0) return default(T);

			TreeNode? node = treeView.SelectedNode;

			var type = typeof(T);
			var fields = type.GetFields();

			var item = Activator.CreateInstance(type);

			while (node != null)
			{
				var field = fields.FirstOrDefault(x => x.Name == node.Name);
				if (field != null)
				{
					field.SetValue(item, node.Text);
				}
				node = node.Parent;
			}

			return item != null ? (T)item : default(T);
		}

		public void setHierarchy(List<(string, bool)> fields)
		{
			hierarchy = fields;
		}

		public void addItem<T>(T item)
		{
			var type = typeof(T);
			var fields = type.GetFields();
			TreeNodeCollection nodes = treeView.Nodes;
			for (int i = 0; i < hierarchy.Count; i++)
			{
				var field = fields.FirstOrDefault(x => x.Name.Equals(hierarchy[i].Item1));
				if (field is not null)
				{
					var node = nodes.Find(field.Name, false).FirstOrDefault(x => x.Text == field.GetValue(item).ToString());
					if (node is not null && !hierarchy[i].Item2)
					{
						nodes = node.Nodes;
					}
					else
					{
						TreeNode newNode = nodes.Add(field.Name, field.GetValue(item).ToString());
						nodes = newNode.Nodes;
					}
				}
			}
		}
	}
}