#region Copyright (c) Microsoft Corporation
/// <copyright company='Microsoft Corporation'>
///    Copyright (c) Microsoft Corporation. All Rights Reserved.
///    Information Contained Herein is Proprietary and Confidential.
/// </copyright>
#endregion

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml.Serialization;

#if WEB_EXTENSIONS_CODE
namespace System.Web.Compilation.WCFModel
#else
namespace Microsoft.VSDesigner.WCFModel
#endif
{
#if WEB_EXTENSIONS_CODE
    internal class DataSvcMapFile : MapFile
#else
    [CLSCompliant(true)]
    public class DataSvcMapFile : MapFile
#endif
    {
        private DataSvcMapFileImpl _impl;

        public DataSvcMapFileImpl Impl
        {
            get
            {
                return _impl;
            }
        }

        public DataSvcMapFile()
        {
            _impl = new DataSvcMapFileImpl();
        }

        public DataSvcMapFile(DataSvcMapFileImpl impl)
        {
            Debug.Assert(impl != null, "impl is null!");

            _impl = impl;
        }

        public override string ID
        {
            get
            {
                return _impl.ID;
            }
            set
            {
                _impl.ID = value;
            }
        }

        public override List<MetadataSource> MetadataSourceList
        {
            get
            {
                return _impl.MetadataSourceList;
            }
        }

        public override List<MetadataFile> MetadataList
        {
            get
            {
                return _impl.MetadataList;
            }
        }

        public override List<ExtensionFile> Extensions
        {
            get
            {
                return _impl.Extensions;
            }
        }

        public List<Parameter> Parameters
        {
            get
            {
                return _impl.Parameters;
            }
        }
    }

    [XmlRoot(Namespace = DataSvcMapFileImpl.NamespaceUri, ElementName = "ReferenceGroup")]
#if WEB_EXTENSIONS_CODE
    internal class DataSvcMapFileImpl
#else
    [CLSCompliant(true)]
    public class DataSvcMapFileImpl
#endif
    {
        public const string NamespaceUri = "urn:schemas-microsoft-com:xml-dataservicemap";

        private string _id;
        private List<MetadataSource> _metadataSourceList;
        private List<MetadataFile> _metadataList;
        private List<ExtensionFile> _extensionFileList;
        private List<Parameter> _parameters;

        [XmlAttribute]
        public string ID
        {
            get
            {
                if (_id == null)
                {
                    _id = Guid.NewGuid().ToString();
                }
                return _id;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                _id = value;
            }
        }

        [XmlArray(ElementName = "MetadataSources", Order = 0)]
        [XmlArrayItem("MetadataSource", typeof(MetadataSource))]
        public List<MetadataSource> MetadataSourceList
        {
            get
            {
                if (_metadataSourceList == null)
                {
                    _metadataSourceList = new List<MetadataSource>();
                }
                return _metadataSourceList;
            }
        }

        [XmlArray(ElementName = "Metadata", Order = 1)]
        [XmlArrayItem("MetadataFile", typeof(MetadataFile))]
        public List<MetadataFile> MetadataList
        {
            get
            {
                if (_metadataList == null)
                {
                    _metadataList = new List<MetadataFile>();
                }
                return _metadataList;
            }
        }

        [XmlArray(ElementName = "Extensions", Order = 2)]
        [XmlArrayItem("ExtensionFile", typeof(ExtensionFile))]
        public List<ExtensionFile> Extensions
        {
            get
            {
                if (_extensionFileList == null)
                {
                    _extensionFileList = new List<ExtensionFile>();
                }
                return _extensionFileList;
            }
        }

        [XmlArray(ElementName = "Parameters", Order = 3)]
        [XmlArrayItem("Parameter", typeof(Parameter))]
        public List<Parameter> Parameters
        {
            get
            {
                if (_parameters == null)
                {
                    _parameters = new List<Parameter>();
                }
                return _parameters;
            }
        }
    }
}