﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Text;
using System.Threading.Tasks;
using Composite.C1Console.Elements;
using Composite.C1Console.Elements.Plugins.ElementProvider;
using Composite.C1Console.Security;
using Composite.Core.ResourceSystem;
using Composite.Core.ResourceSystem.Icons;
using Composite.Data;

namespace Composite.Samples.CustomTreeControl.ElementProvider
{
	public class SampleElementProvider : IHooklessElementProvider
	{
		private static ResourceHandle FolderIcon { get { return CommonElementIcons.Folder; } }
		private static ResourceHandle OpenFolderIcon { get { return CommonElementIcons.FolderOpen; } }


		public ElementProviderContext Context
		{
			get;
			set;
		}

		public IEnumerable<Element> GetChildren(EntityToken entityToken, SearchToken seachToken)
		{
			if (entityToken.Type == "Root")
			{
				foreach (var i in new []{1,2,3})
				{
					var element = new Element(Context.CreateElementHandle(new SampleEntityToken( i.ToString(), "Folder")))
					{
						VisualData = new ElementVisualizedData()
						{
							Label = string.Format("Folder {0}", i),
							ToolTip = string.Format("Folder {0}", i),
							HasChildren = true,
							Icon = FolderIcon,
							OpenedIcon = OpenFolderIcon
						}
					};
					yield return element;
				}

				yield return new Element(Context.CreateElementHandle(new SampleEntityToken("PageFolders", "Pages")))
				{
					VisualData = new ElementVisualizedData()
					{
						Label = "Pages",
						ToolTip = "Pages",
						HasChildren = true,
						Icon = FolderIcon,
						OpenedIcon = OpenFolderIcon
					}
				};

			}
			else if (entityToken.Type == "Folder")
			{
				foreach (var i in new[] { 1, 2, 3 })
				{
					var folderid = entityToken.Id;
					var element = new Element(Context.CreateElementHandle(new SampleEntityToken("Item", i.ToString(), entityToken.Id)))
					{
						VisualData = new ElementVisualizedData()
						{
							Label = string.Format("Item {0}", i),
							ToolTip = string.Format("Item {0}", i),
							HasChildren = false,
							Icon =  new ResourceHandle(BuildInIconProviderName.ProviderName,"data")
						}
					};

					//Value of element in tree
					element.PropertyBag.Add("DataId", string.Format("{0},{1}", folderid, i) );
					yield return element;
				}
			}

			else if (entityToken.Type == "Pages")
			{
				foreach (var pageId in PageManager.GetChildrenIDs(Guid.Empty))
				{
					var page = PageManager.GetPageById(pageId);
					var element = new Element(Context.CreateElementHandle(page.GetDataEntityToken()))
					{
						VisualData = new ElementVisualizedData()
						{
							Label = page.GetLabel(),
							ToolTip = page.Description,
							HasChildren = false,
							Icon =  new ResourceHandle(BuildInIconProviderName.ProviderName,"page")
						}
					};
					element.PropertyBag.Add("DataId", pageId.ToString());
					yield return element;
				}
				
			}
			yield break;
		}

		public IEnumerable<Element> GetRoots(SearchToken seachToken)
		{
			var element = new Element(Context.CreateElementHandle(new SampleEntityToken("RootId", "Root")))
			{
				VisualData = new ElementVisualizedData()
				{
					Label = "Root",
					ToolTip = "Root",
					HasChildren = true,
					Icon = FolderIcon,
					OpenedIcon = OpenFolderIcon
				}
			};
			yield return element;
		}
	}
}
