// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.AspNetCore.Http;

namespace Microsoft.AspNetCore.Routing.Matching
{
    internal sealed class HttpMethodSingleEntryPolicyJumpTable : PolicyJumpTable
    {
        private readonly int _exitDestination;
        private readonly string _method;
        private readonly int _destination;
        private readonly int _corsPreflightExitDestination;
        private readonly int _corsPreflightDestination;

        private readonly bool _supportsCorsPreflight;

        public HttpMethodSingleEntryPolicyJumpTable(
            int exitDestination,
            string method,
            int destination,
            bool supportsCorsPreflight,
            int corsPreflightExitDestination,
            int corsPreflightDestination)
        {
            _exitDestination = exitDestination;
            _method = method;
            _destination = destination;
            _supportsCorsPreflight = supportsCorsPreflight;
            _corsPreflightExitDestination = corsPreflightExitDestination;
            _corsPreflightDestination = corsPreflightDestination;
        }

        public override int GetDestination(HttpContext httpContext)
        {
            var httpMethod = httpContext.Request.Method;
            if (_supportsCorsPreflight && HttpMethodMatcherPolicy.IsCorsPreflightRequest(httpContext, httpMethod, out var accessControlRequestMethod))
            {
                return HttpMethods.Equals(accessControlRequestMethod.ToString(), _method) ? _corsPreflightDestination : _corsPreflightExitDestination;
            }

            return HttpMethods.Equals(httpMethod, _method) ? _destination : _exitDestination;
        }
    }
}
