// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.

using System.Security.Cryptography.X509Certificates;
using System.Security.Principal;
using System.Web.Http.Controllers;
using System.Web.Http.Routing;

namespace System.Web.Http.Batch
{
    internal class BatchHttpRequestContext : HttpRequestContext
    {
        private readonly HttpRequestContext _batchContext;

        public BatchHttpRequestContext(HttpRequestContext batchContext)
        {
            if (batchContext == null)
            {
                throw new ArgumentNullException("batchContext");
            }

            _batchContext = batchContext;
        }

        public HttpRequestContext BatchContext
        {
            get { return _batchContext; }
        }

        public override X509Certificate2 ClientCertificate
        {
            get
            {
                return _batchContext.ClientCertificate;
            }
            set
            {
                _batchContext.ClientCertificate = value;
            }
        }

        public override HttpConfiguration Configuration
        {
            get
            {
                // Use separate route data for configuration (base, not _batchContext).
                return base.Configuration;
            }
            set
            {
                // Use separate route data for configuration (base, not _batchContext).
                base.Configuration = value;
            }
        }

        public override bool IncludeErrorDetail
        {
            get
            {
                return _batchContext.IncludeErrorDetail;
            }
            set
            {
                _batchContext.IncludeErrorDetail = value;
            }
        }

        public override bool IsLocal
        {
            get
            {
                return _batchContext.IsLocal;
            }
            set
            {
                _batchContext.IsLocal = value;
            }
        }

        public override IPrincipal Principal
        {
            get
            {
                return _batchContext.Principal;
            }
            set
            {
                _batchContext.Principal = value;
            }
        }

        public override IHttpRouteData RouteData
        {
            get
            {
                // Use separate route data for batching (base, not _batchContext).
                return base.RouteData;
            }
            set
            {
                // Use separate route data for batching (base, not _batchContext).
                base.RouteData = value;
            }
        }

        public override UrlHelper Url
        {
            get
            {
                // Use a separate URL factory for batching (base, not _batchContext).
                return base.Url;
            }
            set
            {
                // Use a separate URL factory for batching (base, not _batchContext).
                base.Url = value;
            }
        }

        public override string VirtualPathRoot
        {
            get
            {
                return _batchContext.VirtualPathRoot;
            }
            set
            {
                _batchContext.VirtualPathRoot = value;
            }
        }
    }
}
