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

using System;

namespace Microsoft.AspNetCore.Razor.Language
{
    internal abstract class RazorParserFeatureFlags
    {
        public static RazorParserFeatureFlags Create(RazorLanguageVersion version, string fileKind)
        {
            if (fileKind == null)
            {
                throw new ArgumentNullException(nameof(fileKind));
            }

            var allowMinimizedBooleanTagHelperAttributes = false;
            var allowHtmlCommentsInTagHelpers = false;
            var allowComponentFileKind = false;
            var allowRazorInAllCodeBlocks = false;
            var allowUsingVariableDeclarations = false;
            var allowConditionalDataDashAttributes = false;
            var allowCSharpInMarkupAttributeArea = true;
            var allowNullableForgivenessOperator = false;

            if (version.CompareTo(RazorLanguageVersion.Version_2_1) >= 0)
            {
                // Added in 2.1
                allowMinimizedBooleanTagHelperAttributes = true;
                allowHtmlCommentsInTagHelpers = true;
            }

            if (version.CompareTo(RazorLanguageVersion.Version_3_0) >= 0)
            {
                // Added in 3.0
                allowComponentFileKind = true;
                allowRazorInAllCodeBlocks = true;
                allowUsingVariableDeclarations = true;
                allowNullableForgivenessOperator = true;
            }

            if (FileKinds.IsComponent(fileKind))
            {
                allowConditionalDataDashAttributes = true;
                allowCSharpInMarkupAttributeArea = false;
            }

            if (version.CompareTo(RazorLanguageVersion.Experimental) >= 0)
            {
                allowConditionalDataDashAttributes = true;
            }

            return new DefaultRazorParserFeatureFlags(
                allowMinimizedBooleanTagHelperAttributes,
                allowHtmlCommentsInTagHelpers,
                allowComponentFileKind,
                allowRazorInAllCodeBlocks,
                allowUsingVariableDeclarations,
                allowConditionalDataDashAttributes,
                allowCSharpInMarkupAttributeArea,
                allowNullableForgivenessOperator);
        }

        public abstract bool AllowMinimizedBooleanTagHelperAttributes { get; }

        public abstract bool AllowHtmlCommentsInTagHelpers { get; }

        public abstract bool AllowComponentFileKind { get; }

        public abstract bool AllowRazorInAllCodeBlocks { get; }

        public abstract bool AllowUsingVariableDeclarations { get; }

        public abstract bool AllowConditionalDataDashAttributes { get; }

        public abstract bool AllowCSharpInMarkupAttributeArea { get; }

        public abstract bool AllowNullableForgivenessOperator { get; }

        private class DefaultRazorParserFeatureFlags : RazorParserFeatureFlags
        {
            public DefaultRazorParserFeatureFlags(
                bool allowMinimizedBooleanTagHelperAttributes,
                bool allowHtmlCommentsInTagHelpers,
                bool allowComponentFileKind,
                bool allowRazorInAllCodeBlocks,
                bool allowUsingVariableDeclarations,
                bool allowConditionalDataDashAttributesInComponents,
                bool allowCSharpInMarkupAttributeArea,
                bool allowNullableForgivenessOperator)
            {
                AllowMinimizedBooleanTagHelperAttributes = allowMinimizedBooleanTagHelperAttributes;
                AllowHtmlCommentsInTagHelpers = allowHtmlCommentsInTagHelpers;
                AllowComponentFileKind = allowComponentFileKind;
                AllowRazorInAllCodeBlocks = allowRazorInAllCodeBlocks;
                AllowUsingVariableDeclarations = allowUsingVariableDeclarations;
                AllowConditionalDataDashAttributes = allowConditionalDataDashAttributesInComponents;
                AllowCSharpInMarkupAttributeArea = allowCSharpInMarkupAttributeArea;
                AllowNullableForgivenessOperator = allowNullableForgivenessOperator;
            }

            public override bool AllowMinimizedBooleanTagHelperAttributes { get; }

            public override bool AllowHtmlCommentsInTagHelpers { get; }

            public override bool AllowComponentFileKind { get; }

            public override bool AllowRazorInAllCodeBlocks { get; }

            public override bool AllowUsingVariableDeclarations { get; }

            public override bool AllowConditionalDataDashAttributes { get; }

            public override bool AllowCSharpInMarkupAttributeArea { get; }

            public override bool AllowNullableForgivenessOperator { get; }
        }
    }
}
