//-----------------------------------------------------------------------------
// <copyright file="AWSXRayMiddlewareExtensions.cs" company="Amazon.com">
//      Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
//      Licensed under the Apache License, Version 2.0 (the "License").
//      You may not use this file except in compliance with the License.
//      A copy of the License is located at
//
//      http://aws.amazon.com/apache2.0
//
//      or in the "license" file accompanying this file. This file is distributed
//      on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
//      express or implied. See the License for the specific language governing
//      permissions and limitations under the License.
// </copyright>
//-----------------------------------------------------------------------------
using Amazon.XRay.Recorder.Core.Strategies;
using Amazon.XRay.Recorder.Handlers.AspNetCore.Internal;
using Microsoft.Extensions.Configuration;

namespace Microsoft.AspNetCore.Builder
{
    /// <summary>
    /// The Middleware Extension to intercept HTTP request for ASP.NET Core.
    /// For each request, <see cref="AWSXRayMiddleware"/> will try to parse trace header
    /// from HTTP request header, and determine if tracing is enabled. If enabled, it will
    /// start a new segment before invoking inner handler. And end the segment before it returns
    /// the response to outer handler.
    /// </summary>
    public static class AWSXRayMiddlewareExtensions
    {
        /// <summary>
        /// Adds <see cref="AWSXRayMiddleware"/> to the applicaion's request pipeline.
        /// </summary>
        /// <param name="builder">Instance of <see cref="IApplicationBuilder"/>.</param>
        /// <param name="segmentName">Segment name.</param>
        /// <returns>Instance of <see cref="IApplicationBuilder"/> instrumented with X-Ray middleware.</returns>
        public static IApplicationBuilder UseXRay(this IApplicationBuilder builder, string segmentName)
        {
            return builder.UseMiddleware<AWSXRayMiddleware>(segmentName);
        }

        /// <summary>
        /// Adds <see cref="AWSXRayMiddleware"/> to the applicaion's request pipeline.
        /// </summary>
        /// <param name="builder">Instance of <see cref="IApplicationBuilder"/></param>
        /// <param name="segmentName">Segment name.</param>
        /// <param name="configuration"></param>
        /// <returns>Instance of <see cref="IApplicationBuilder"/> instrumented with X-Ray middleware.</returns>
        public static IApplicationBuilder UseXRay(this IApplicationBuilder builder, string segmentName, IConfiguration configuration)
        {
            return builder.UseMiddleware<AWSXRayMiddleware>(segmentName, configuration);
        }

        /// <summary>
        /// Adds <see cref="AWSXRayMiddleware"/> to the applicaion's request pipeline.
        /// </summary>
        /// <param name="builder">Instance of <see cref="IApplicationBuilder"/>.</param>
        /// <param name="segmentNamingStrategy"></param>
        /// <returns>Instance of <see cref="IApplicationBuilder"/> instrumented with X-Ray middleware.</returns>
        public static IApplicationBuilder UseXRay(this IApplicationBuilder builder, SegmentNamingStrategy segmentNamingStrategy)
        {
            return builder.UseMiddleware<AWSXRayMiddleware>(segmentNamingStrategy);
        }

        /// <summary>
        /// Adds <see cref="AWSXRayMiddleware"/> to the applicaion's request pipeline.
        /// </summary>
        /// <param name="builder">Instance of <see cref="IApplicationBuilder"/>.</param>
        /// <param name="segmentNamingStrategy"></param>
        /// <param name="configuration"></param>
        /// <returns>Instance of <see cref="IApplicationBuilder"/> instrumented with X-Ray middleware.</returns>
        public static IApplicationBuilder UseXRay(this IApplicationBuilder builder, SegmentNamingStrategy segmentNamingStrategy, IConfiguration configuration)
        {
            return builder.UseMiddleware<AWSXRayMiddleware>(segmentNamingStrategy, configuration);
        }
    }
}