using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

namespace System.ServiceModel.Routing.Configuration
{
	public sealed class RoutingExtensionElement : BehaviorExtensionElement
	{
		public override Type BehaviorType {
			get { return typeof (RoutingExtension); }
		}

		[ConfigurationProperty ("filterTableName", DefaultValue = null)]
		public string FilterTableName {
			get { return (string) base ["filterTableName"]; }
			set { base ["filterTableName"] = value; }
		}

		[ConfigurationProperty ("routeOnHeadersOnly", DefaultValue = true, Options = ConfigurationPropertyOptions.None)]
		public bool RouteOnHeadersOnly {
			get { return (bool) base ["routeOnHeadersOnly"]; }
			set { base ["routeOnHeadersOnly"] = value; }
		}

		[ConfigurationProperty ("soapProcessingEnabled", DefaultValue = true)]
		public bool SoapProcessingEnabled {
			get { return (bool) base ["soapProcessingEnabled"]; }
			set { base ["soapProcessingEnabled"] = value; }
		}

		protected internal override object CreateBehavior ()
		{
			var table = RoutingSection.CreateFilterTable (FilterTableName);

			var cfg = new RoutingConfiguration (table, RouteOnHeadersOnly) { SoapProcessingEnabled = this.SoapProcessingEnabled };
			return new RoutingBehavior (cfg);
		}
	}
}