//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------

namespace System.ServiceModel.Configuration
{
    using System;
    using System.ServiceModel;
    using System.Configuration;
    using System.ServiceModel.Channels;
    using System.Xml;

    public partial class EndpointAddressElementBase : ServiceModelConfigurationElement
    {
        protected EndpointAddressElementBase()
        {
        }

        [ConfigurationProperty(ConfigurationStrings.Address, DefaultValue = null, Options = ConfigurationPropertyOptions.IsRequired)]
        public Uri Address
        {
            get { return (Uri)base[ConfigurationStrings.Address]; }
            set { base[ConfigurationStrings.Address] = value; }
        }

        [ConfigurationProperty(ConfigurationStrings.Headers)]
        public AddressHeaderCollectionElement Headers
        {
            get { return (AddressHeaderCollectionElement)base[ConfigurationStrings.Headers]; }
        }

        [ConfigurationProperty(ConfigurationStrings.Identity)]
        public IdentityElement Identity
        {
            get { return (IdentityElement)base[ConfigurationStrings.Identity]; }
        }


        internal protected void Copy(EndpointAddressElementBase source)
        {
            if (this.IsReadOnly())
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigReadOnly)));
            }
            if (null == source)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("source");
            }

            this.Address = source.Address;
            this.Headers.Headers = source.Headers.Headers;
            PropertyInformationCollection properties = source.ElementInformation.Properties;
            if (properties[ConfigurationStrings.Identity].ValueOrigin != PropertyValueOrigin.Default)
            {
                this.Identity.Copy(source.Identity);
            }
        }

        public void InitializeFrom(EndpointAddress endpointAddress)
        {
            if (null == endpointAddress)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpointAddress");
            }

            SetPropertyValueIfNotDefaultValue(ConfigurationStrings.Address, endpointAddress.Uri);
            this.Headers.InitializeFrom(endpointAddress.Headers);

            if (null != endpointAddress.Identity)
            {
                this.Identity.InitializeFrom(endpointAddress.Identity);
            }
        }
    }
}