﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Composite.C1Console.Elements;
using Composite.C1Console.Security;
using Composite.C1Console.Trees;
using Composite.Core.Xml;
using Composite.Functions;

namespace Composite.Samples.CustomWidgetProvider
{
	public class SimpleTextWidgetFunction : IWidgetFunction
	{


		public SimpleTextWidgetFunction(string name, string description)
		{
			Name = name;
			Description = description;
		}

		public XElement GetWidgetMarkup(ParameterList parameters, string label, HelpDefinition helpDefinition, string bindingSourceName)
		{
			return new XElement(Namespaces.BindingFormsStdUiControls10 + Name,
					new XAttribute("Label", label),
					new XAttribute("Help", helpDefinition.HelpText),
							new XElement(Namespaces.BindingForms10 + "bind",
									new XAttribute("source", bindingSourceName)));
		}

		public string Description { get; private set; }

		public EntityToken EntityToken
		{
			get { return new SimpleWidgetFunctionEntityToken(string.Format("{0}.{1}", Namespace, Name)); }
		}

		public string Name { get; private set; }

		public string Namespace
		{
			get { return "Composite.Samples.String"; }
		}

		public IEnumerable<ParameterProfile> ParameterProfiles
		{
			get { yield break; }
		}

		public Type ReturnType
		{
			get { return typeof(string); }
		}


	}

	[SecurityAncestorProvider(typeof(SimpleAncestorSecurityAncestorProvider))]
	public class SimpleWidgetFunctionEntityToken : EntityToken
	{
		private string _id;

		internal SimpleWidgetFunctionEntityToken(string id)
		{
			_id = id;
		}

		public override string Id { get { return _id; } }
		public override string Source { get { return ""; } }
		public override string Type { get { return ""; } }

		// Responsible for serializing the state of this EntityToken as a string
		public override string Serialize()
		{
			return _id;
		}

		// Respinsible for deserializing the string return by the serializer above
		public static EntityToken Deserialize(string serializedEntityToken)
		{
			return new SimpleWidgetFunctionEntityToken(serializedEntityToken);
		}
	}

	internal sealed class SimpleAncestorSecurityAncestorProvider : ISecurityAncestorProvider
	{
		public IEnumerable<EntityToken> GetParents(EntityToken entityToken)
		{
			yield return AttachingPoint.PerspectivesRoot.EntityToken;
		}
	}

}
